- Collection接口
- List
- LinkedList
- ArrayList
- Stack
- Vector
- Set
- HashSet / LinkedHashSet
- TreeSet
- Queue
- Deque
- LinkedList
- Map接口
- HashMap / HashTable
- LinkedHashMap
- TreeMap
- 并发集合
- ConcorrentHashMap( 1.7 + 1.8 )
- CopyOnWriteArrayList
- CopyOnWriteSet
1. Collection接口 - List
1.1 LinkedList
- 线程不安全:可以用 Collections.synchronizedList 替换
- 又属于List,又属于Queue:双向链表 ,也是双端队列
- 底层是Node类,允许null值
- 相比ArrayList:查找慢,删除插入快,占用空间更大
- Ref:https://www.jianshu.com/p/6a9cb631b2ef
1.2 ArrayList
- 线程不安全:可以用 Vector 或 CopyOnWriteArrayList 或 Collections.synchronizedList 替换
- 底层是 Object[] 数组,允许null值
- 调用ArrayList()默认容量0,第一次添加元素后变成10,之后1.5倍扩容:0 -> 10 -> 15 -> 22 -> 33 -> ...
- 相比LinkedList: 查找快, 修改操作慢,因为需要Copy
- Ref:https://www.jianshu.com/p/a01659ca07f8
1.3 Vector
- 线程安全,但是效率很低,官方不推荐使用,大多数方法上都加了synchronized关键字
- 底层是 Object[] 数组,允许null值
- 扩容与ArrayList不一样,,默认容量是10,2倍扩容
1.4 Stack
- Stack继承Vector,线程安全
- 栈,特点:后入先出
- 底层是Object[]实现
- 一般用LinkedList当作栈使用
2. Collection接口 - Set
2.1 HashSet / LinkedHashSet
- HashSet与HashMap底层差不多,线程不安全,可以用 Collections.SynchronizedSet 或 CopyOnWriteSet 代替
- LinkedHashSet与LinkedHashMap底层差不多,多了双向链表,线程不安全,可以用 SynchronizedSortedSet 代替
- HashSet允许null,但只能一个
2.2 TreeSet
- 参考TreeMap
3. Collection接口 - Queue
3.1 Deque
- 线程不安全
- 推荐同Deque代替Stack
- Ref:https://blog.csdn.net/devnn/article/details/82716447
3.2 LinkedList
见上1.1
4. Map接口
4.1 HashMap
- 线程不安全,可以用 HashTable / Collections.SynchronizedMap / ConcurrentHashMap 代替
- 1.7 数组+链表+头插(扩容可能死锁),多次扰动计算hash,扩容需要重新计算index
- 1.8 数组+红黑树+尾插,扩容后index只有两种选择
- 1.7:https://blog.csdn.net/carson_ho/article/details/79373026
- 1.8:https://blog.csdn.net/carson_ho/article/details/79373134
4.2 HashTable
- HashTable线程安全,但是效率很低,在大多数方法上加了synchronized关键字
- HashTable不允许null值
- HashTable直接使用对象的hashCode,不像 HashMap 涉及 二次抖动 等
4.3 LinkedHashMap
- 底层与HashMap差不多,多维护了一个双向链表,线程不安全,可以用 Collections.SynchronizedSortedMap 代替
- 原理:多了两个属性before和after用来维护双向链表
-
static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K key, V value, Node<K,V> next) { super(hash, key, value, next); } }
-
- 性能没有HashMap高,因为要维护双向链表
- Ref:https://blog.csdn.net/weixin_43184769/article/details/89357948
4.4 TreeMap
- 根据key排序,内部原理红黑树