一、Collection 接口(单列集合)
1.子接口
1.1 List接口
1.1.1 特点
List的特点是有序,允许重复(值不唯一)
1.1.2 常见实现类
(1).线程不安全
ArrayList
1.数据结构:数组:Object[ ] elementData
2.使用场景:查找、遍历效率高,插入、删除效率低
3.扩容方式:
(1).初始化:
- 无参构造方法,数组的初始化容量为0,添加第一个元素时,数组容量扩容为10
- 有参构造方法,数组按指定容量初始化
(2).容量不足时: 按照数组现有容量的1.5倍扩容
LinkedList
1.数据结构:链表:双向链表
2.使用场景:插入、删除效率高,查找效率低
3.扩容方式:链表动态扩容,每添加一个节点,链表动态扩容一个元素空间
(2).线程安全
Vector
1.数据结构:数组:Object[ ] elementData
2.扩容方式
(1).初始化:
- 无参构造方法,数组的初始化容量为10
- 有参构造方法,数组按指定容量初始化
(2).容量不足时:按照数组现有容量的2倍或指定容量值(capacityIncrement)进行扩容
3.线程安全:通过“synchronized”同步锁实现
Stack
1.stack是vector的子类,数据结构与扩容方式与vector相同
2.特点:先进后出FILO or 后进先出LIFO
CopyOnWriteArrayList
1.数据结构:数组:Object[] array
2.线程安全:
- 通过“ReentrantLock”锁实现
- CopyOnWrite:"写入"操作时,先进行数组复制,然后在新数组中进行写入操作,然后替换;允许读写同时进行;
1.2 Set接口
1.2.1 特点
set的特点是无序,不允许重复(值唯一)
1.2.2 常见实现类
HashSet
1.特点:无序
2.数据结构:HashMap
LinkedHashSet
1.特点:有序
2.数据结构:LinkedHashMap
TreeSet
1.特点:自动排序
2.数据结构:TreeMap
1.3 Queue接口
1.3.1特点
Queue的特点是先进先出FIFO,队头出队,队尾入队;
1.3.2常见实现类
(1).线程不安全
LinkedList
LinkedList基于“双向链表”实现的队列
PriorityQueue
PriorityQueue基于“堆”实现的优先队列
(2)线程安全
BlockingQueue
阻塞队列:
- ArrayBlockingQueue(有界)
- LinkedBlockingQueue(无界)
二、Map接口 (键值对集合)
1.实现类
(1).线程不安全
HashMap
1.特点:无序
2.数据结构:数组(哈希表)+ 链表(链地址法解决哈希表冲突) + 红黑树(自平衡二叉树,提高查找效率)
3.转换成红黑树的条件:链表的元素个数超过8,并且数组长度大于等于64
4.转换成红黑树的优点:
- 链表过长,会导致搜索效率降低,使用红黑树提高查找效率;
- 红黑树,是一颗自平衡的二叉查找树,树中所有节点均自动排序,并且自平衡,可以使用二分查找,提高查找效率。
5.扩容条件:
- 默认情况下,数组长度为16(自定义时,必须保证数组长度为2^n 次幂)
- 达到扩容阈值threshold,按照2倍进行扩容
- 链表长度大于8,数组长度小于64
LinkedHashMap
1.特点:有序
2.数据结构:HashMap的子类,多维护了一条双向链表,保存顺序
TreeMap
1.特点:自动按照key排序
2.数据结构:红黑树
(2).线程安全
Hashtable
1.特点:无序、key和value不允许为null
2.数据结构:数组+链表
3. 线程安全:通过“synchronized”同步锁实现
ConcurrentHashMap
1.特点:无序
2.数据结构:数组+链表+红黑树
3.线程安全:synchronized同步锁 + CAS无锁化编程模型
三、Collections工具类
封装了集合的常见算法和操作