常用集合 Set MAP List
一.List
-
ArrayList 由数组构成的List object[] elementData 实际存储的数组 int size 实际长度 int DEFAULT_CAPACITY = 10 初始容量10. 扩容过程:put的时候如果size+1>elementData.length,则对elementData扩容至1.5倍
-
LinkedList 由双向链表构成的数组
-
Vector 由数组构成的线性安全的List 在每个方法前加synchronized来保证安全。
二、Map
保存KV对,K不可重复
- HashMap Node<K,V>[] table 实际存储是由链表组成的数组。
int DEFAULT_INITIAL_CAPACITY = 1 << 4
数组默认长度16 final float loadFactor; 负载因子,初始值0.75.当前数组长度 * loadFactor来判断是否需要扩容。 int threshold ; The next size value at which to resize (capacity * load factor). 扩容过程:如果size+1 > threshold 则进行扩容,table长度扩大2倍。然后链表上的一一挪到正确的新的数组上。
1.8以后HashMap下的链表进行优化了,改成当链表的长度大于8的时候优化成红黑树。
-
ConcurrentHashMap 线性安全的,通过分段把锁的粒度降低,提高效率
-
Hashtable 线性安全,通过方法前加上synchronized来锁,效率较低。
三、HashSet
保存K HashMap<E,Object> map; public boolean add(E e) { return map.put(e, PRESENT)==null; }
HashSet内部实际是一个HashMap,把值作为Key放入HashMap中。