前言:集合类是什么呢?
简单来说,集合类就是一个存放数据对象引用的容器;
- 集合类是定义在Java.util包下的一组接口和实现类;
- 集合类型主要有3种:set(集)、list(列表)、map(映射);
- 集合类中存放的都是对象的引用,而非对象本身;
集合类的分类
set
特点:
- 属于单列集合,不允许包含重复元素;
- 判断元素重复的标准为对象的equals方法,存在时返回false,不存在时返回true;
- 元素的排序规则,由相应的实现类决定,分为无序、元素大小排序、写入顺序排序;
名称 | 类型 | 线程同步 | 描述 |
---|---|---|---|
Set | 接口 | 同步 | 继承了Collection接口 |
SortedSet | 接口 | 同步 | 继承了set接口 |
HashSet | 实现类 | 不同步 | 实现了Set、Cloneable、Serializable接口 |
TreeSet | 实现类 | 不同步 | 实现了SortedSet、Cloneable、Serializable接口 |
HashSet
特点:
- 实现了Set接口,看源码可以发现HashSet是一个HashMap实例;
- HashSet不保证集合内的元素有序,允许null元素存在;
- HashSet中保存的元素以键值对形式保存;
TreeSet
特点:
- TreeSet 中的元素有序的,排序规则遵照元素本身的大小进行排序,元素不能重复;
- TreeSet中保存的元素以键值对形式保存;
List
特点:
- List 集合属于单列、有序的、允许元素重复、可以为 null 的集合;
- List 接口的实现类主要有三种:ArrayList、LinkedList、Vector;
名称 | 类型 | 线程同步 | 描述 |
---|---|---|---|
List | 接口 | 同步 | 实现了Collection接口 |
ArrayList | 实现类 | 不同步 | 继承了AbstractList类,实现了List、Cloneable、Serializable接口 |
LinkedList | 实现类 | 不同步 | 继承了AbstractList类,实现了List、Deque、Cloneable、Serializable接口 |
Vector | 实现类 | 同步 | 继承了AbstractList类,实现了List、Cloneable、Serializable接口 |
ArrayList
特点:
- 继承了AbstractList抽象类,实现了List接口,底层结构是数组;
- 默认初始化长度为 10,扩容规则为 0.5倍的原容量加1,即一次扩容后的长度为 16;
- 查询速度快,添加、删除相对于LinkedList较慢,线程不同步(不安全);
- 继承了AbstractList抽象类,实现了list接口,底层结构是链表;
- 添加、删除速度快,查询相对于ArrayList较慢、线程不同步(不安全);
Vector
特点:
- 继承了AbstractList抽象类,实现了List接口,底层结构是数组;
- 默认初始化长度为 10,扩容加载因子为 1,当元素长度大于原容量时进行扩容,默认为 10,一次扩容后容量为 20;
- 线程安全,但是速度慢;
Stack
特点:
- 继承了Vector类,元素满足后进先出;
Queue
特点:
- 实现了Collection接口,元素满足先进先出;
Deque
特点:
- 继承了Queue接口,是一个双端队列;
PriorityQueue
特点:
- 实现了Queue接口,是一个基于堆实现的优先级队列;
Map
Map集合最常见的子类也有两个:HashMap、TreeMap;
名称 | 类型 | 线程同步 | 描述 |
---|---|---|---|
Map | 接口 | 同步 | |
HashMap | 实现类 | 不同步 | 实现了Map、Cloneable、Serializable接口 |
TreeMap | 实现类 | 不同步 | 实现了SortedMap、Cloneable、Serializable接口接口 |
HashMap
特点:
- HashMap实现了 Map接口,底层采用链表或红黑树进行存储;
- 默认初始化长度为 16,扩容加载因子为 0.75,一旦大于 0.75*16之后,就会调用resize()进行扩容,扩容2倍,即32;
- 支持克隆、无序,线程不同步,不安全;
TreeMap
特点:
- TreeMap实现了SortedMap接口;
- 数据结构基于二叉搜索树(红黑树)实现;
- 该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法;
- 无初始化长度;
- 支持克隆、有序,线程不同步,不安全;
总结
-
List,Set都是继承自Collection接口,Map不是;
-
List特点:元素有放入顺序,元素可重复;
-
Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉;
注意:元素虽然无放入顺序,但是元素在set中的位置是由该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ;另外list支持for循环,也就是通过下标来遍历,也可以用迭代器;但是set只能用迭代,因为它无序,无法用下标来取得想要的值!!! -
Set:检索元素效率低,删除和插入效率高,插入和删除不会引起元素位置改变;
-
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低(会引起其他元素位置改变);
-
Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复;