总览
list 有索引,允许重复,可以放空(所以可以多个空)
set 没有索引,不允许重复,可以放空(所以一个空)
没有synchronized,线程不安全(执行效率高)
有synchronized,线程安全(执行效率低)
1. ArrayList 与 LinkedList
1.1 ArrayList
数组
1.2 LinkedList
双向链表,双端队
|无参初试为0,第一次扩充为10,再次扩充1.5(old + old>>1)倍 ;有参第一个为你设置的大小,再次扩容为1.5(old + old>>1)倍|无参初试为0,第一次扩充为10,再次扩充(old + old)倍 有参第一个为你设置的大小,再次扩容为(old + old)倍|
|Arrays.copyof扩容|Arrays.copyof扩容|
、
2. HashMap
数组 链表 红黑树
哈希拉链法
transient HashMap.Node<K, V>[] table;
transient Set<Entry<K, V>> entrySet;
数组到64 且 链表数量到达8 链表变为红黑树
插入流程:见源码 putVal方法
- table为null 且 length为0扩容到16,设置下次扩容界限
加载因子(0.75)*大小=扩容界限 ,所以第一次界限为12 - 插入
- node数量,数组方向是否扩容
注:hashtable 等同hashmap 只不过加了锁
3. LinkedHashMap
数组+链表+红黑树+双向链表
原理与HashMap 一致,只是增加了双向链表的数据结果可以维护加入顺序
同样数组到64 且 链表数量到达8 链表变为红黑树,这里就不画图展示了
4. HashSet
HashSet 底层为 private transient LinkedHashMap<E, Object> map 继承实现,私有构造
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}
5. LinkedHashSet
LinkedHashSet 只不过把V固定为object,其余一致LinkedHashMap一致
6. TreeMap
红黑树
7. TreeSet
由TreeMap实现
8. properties
继承hashtable,用于读取配置文件