1. 集合的定义
什么是集合呢?
定义: 集合是一个存放对象的引用的容器.
在 Java 中, 集合位于 java.util 包下.
2. 集合和数组的区别(面试常问)
提到容器, 就会想起数组, 那么集合和数组的区别是什么呢?(这里是重点, 面试可能问的比较多)
数组和集合都是 Java 中的容器
数组的长度是固定的, 集合的长度是可变的
数组只能存储相同数据类型的数据, 这里的数据类型可以是基本数据类型, 也可以是引用类型
集合可以存储不同数据类型的对象的引用(但一般情况下, 我们会使用泛型来约定只使用 1 种数据类型), 但不能存储基本数据类型
空口无凭, 我们来点代码配合理解, 首先, 我们看下如下的数组代码:
- String[] platformArray = new String[3];
- platformArray[0] = "博客园";
- platformArray[1] = "掘金";
- platformArray[2] = "微信公众号";
- platformArray[3] = "个人博客";
运行代码就会发现, platformArray[3] = "个人博客"; 会引发 java.lang.ArrayIndexOutOfBoundsException 异常.
而使用集合时就不存在这个问题, 因为集合在声明时不需要指定长度并且长度会根据放入元素的多少而变化:
- List<String> platformList = new ArrayList<>();
- platformList.add("博客园");
- platformList.add("掘金");
- platformList.add("微信公众号");
- platformList.add("个人博客");
观察上面声明数组的代码, 我们可以推断出下面的代码肯定是编译不通过的:
- String[] platformArray = new String[3];
- platformArray[0] = "博客园";
- platformArray[1] = "掘金";
- platformArray[2] = 1;
因为数组声明时用的是 String 类型, 而 platformArray[2] = 1; 赋值时却使用了 int 类型.
再来看下下面的集合代码:
- List<int> intList = new ArrayList<int>();
- intList.add(1);
- intList.add(2);
- intList.add(3);
这段代码也是编译不通过的, 在 IDEA 中, 鼠标悬停时会提示如下的错误信息:
意思是类型参数不能是原始类型(基本数据类型), 那怎么使用呢? 总不能不让我使用 int 型的集合吧?
当然不会, Java 为每种基本数据类型都提供了对应的包装类, 这里修改为 int 类型对应的包装类 Integer 即可:
- List<Integer> intList = new ArrayList<Integer>();
- intList.add(1);
- intList.add(2);
- intList.add(3);
以下为 Java 的原始类型 (基本数据类型) 与其对应的包装类:
原始类型 (基本数据类型) | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
3. 集合的分类
在 Java 中, 集合主要分为以下 3 种:
List 集合
Set 集合
Map 集合
它们之间的继承关系可以参考下图.
从上图可以总结出如下几点:
Java 集合的根接口是 Collection, 它又继承了迭代接口 Iterable
List 接口和 Set 接口继承了 Collection 接口
Map 接口是独立的接口, 并没有继承 Collection 接口 (这里是重点, 面试可能问的比较多)
List 接口常用的实现类有: ArrayList,LinkedList,Vector
Set 接口常用的实现类有: HashSet,LinkedHashSet,TreeSet
Map 接口常用的实现类有: HashMap,HashTable,TreeMap
4. List 集合
List 集合包括 List 接口以及 List 接口的所有实现类. List 集合具有以下特点:
集合中的元素允许重复
集合中的元素是有顺序的, 各元素插入的顺序就是各元素的顺序
集合中的元素可以通过索引来访问或者设置
List 接口常用的实现类有: ArrayList,LinkedList,Vector.
我们先看下如下示例了解下 List 集合的用法:
- package collection;
- import java.util.*;
- public class Muster {
- public static void main(String[] args) {
- List<String> strList = new ArrayList<>();
- strList.add("a");
- strList.add("b");
- strList.add("c");
- int i = (int) (Math.random() * strList.size());
- System.out.println("随机获取数组中的元素:" + strList.get(i));
- strList.remove(2);
- System.out.println("将索引为 2 的元素从列表移除后, 数组中的元素是:");
- for (int j = 0; j <strList.size(); j++) {
- System.out.println(strList.get(j));
- }
- }
- }
以上代码的输出结果为:
随机获取数组中的元素: a
将索引为 2 的元素从列表移除后, 数组中的元素是:
a
b
关于 List 集合的详细用法, ArrayList,LinkedList,Vector 的区别(这里是重点, 面试可能问的比较多), 后续会单独写文总结, 敬请期待.
5. Set 集合
Set 集合包括 Set 接口以及 Set 接口的所有实现类. Set 集合具有以下特点:
集合中不包含重复元素(你可以重复添加, 但只会保留第 1 个)
集合中的元素不一定保证有序
Set 接口常用的实现类有: HashSet,LinkedHashSet,TreeSet.
我们先看下如下示例了解下 Set 集合的用法:
- package collection;
- import java.util.*;
- public class Muster {
- public static void main(String[] args) {
- Set<String> platformList = new HashSet<>();
- platformList.add("博客园");
- platformList.add("掘金");
- platformList.add("微信公众号");
- platformList.add("个人博客");
- // 尝试添加重复元素
- platformList.add("博客园");
- platformList.add("掘金");
- for (String platform : platformList) {
- System.out.println(platform);
- }
- }
- }
以上代码的输出结果为:
博客园
个人博客
掘金
微信公众号
可以看出, 虽然我们尝试添加了重复元素, 但并没有添加成功并且输出的元素没有顺序.
因此当你的集合中不允许有重复元素并且对排序也没有要求的话, 可以使用 Set 集合.
关于 Set 集合的详细用法, HashSet,LinkedHashSet,TreeSet 的区别(这里是重点, 面试可能问的比较多), 后续会单独写文总结, 敬请期待.
6. Map 集合
Map 集合包括 Map 接口以及 Map 接口的所有实现类. Map 集合具有以下特点:
Map 接口并没有继承 Collection 接口, 提供的是 key 到 value 的映射
Map 中不能包含相同的 key
Map 接口常用的实现类有: HashMap,HashTable,TreeMap.
我们先看下如下示例了解下 Map 集合的用法:
- package collection;
- import java.util.*;
- public class Muster {
- public static void main(String[] args) {
- Map<Integer, String> platformMap = new HashMap<>();
- platformMap.put(1, "博客园");
- platformMap.put(2, "掘金");
- platformMap.put(3, "微信公众号");
- platformMap.put(4, "个人博客");
- // 尝试添加重复 Map
- platformMap.put(4, "个人博客");
- // 获取所有的 key
- Set<Integer> keys = platformMap.keySet();
- for (Integer integer : keys) {
- System.out.println("Key:" + integer + ",Value:" + platformMap.get(integer));
- }
- }
- }
以上代码的输出结果为:
Key:1,Value: 博客园
Key:2,Value: 掘金
Key:3,Value: 微信公众号
Key:4,Value: 个人博客
从日志可以看出, 当我们尝试重加重复 Map 时, 并没有添加成功.
关于 Map 集合的详细用法, HashMap,HashTable,TreeMap 的区别(这里是重点, 面试可能问的比较多), 后续会单独写文总结, 敬请期待.
7. 源码及参考
Java 集合中 List,Set 以及 Map 等集合体系详解(史上最全)
8. 最后
来源: https://www.cnblogs.com/zwwhnly/p/11251562.html