- HashTable
底層是數組+鏈表,初始容量是11,負載因子0.75,擴容2倍+1,頭插法,採用的Entry
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
- HashMap
底層是數組+鏈表,初始容量16,負載因子0.75,擴容2倍,1.8開始採用尾插法,採用的Node
。
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
- TreeMap
底層是紅黑樹,採用的Entry
- LinkedHashMap
- 底層是基於HashMap的,在此基礎上Entry節點還保存了指向前後節點的指針before和after。
- LinkedHashMap有head和tail屬性,指向雙向鏈表的頭和尾。
- 擴容時:HashMap是遍歷table,LinkedHashMap是遍歷雙向鏈表。
- 從遍歷的效率來說,遍歷雙向鏈表的效率要高於遍歷table,因爲遍歷雙向鏈表是N次(N爲元素個數);而遍歷table是N+table的空餘個數(N爲元素個數)。
- 參考博客:https://www.jianshu.com/p/8f4f58b4b8ab
- ArrayList 1.5倍擴容
- CopyOnWriteArrayList 沒有1.5倍擴容
- Vector 2倍擴容使用synchronized加鎖
- HashSet,底層是HashMap
- TreeSet,底層是TreeMap