Java8 HashMap ,hashTable,TreeMap 看源代碼看到的一些特性
HashMap:
默認不初始化hash表,在put時才初始化開辟16個容量的數組,擴展因子3/4。
新容量 和 擴展錨點: newCap = oldCap << 1 newThr = oldThr << 1;【初始化oldCap =16 ;oldThr =12】
hash算法 (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
新增一個不存在數據,加在鏈表尾部
當某個鏈表上的個數超過8個即第9個時。鏈表會有兩種格式存儲。鏈表和紅黑樹。
允許有空的key和value
調用keySet values 方法時,用鏈表遍歷
調用 remove(Object key)方法時會用到紅黑樹的查找方法。
調用 keySet contains 方法時會用到紅黑樹的查找方法。
調用 values contains 方法時會用到鏈表的查找方法。
HashTable:
new HashTable對象時 默認初始化開辟11個容量的數組,擴展因子3/4。
新容量 和 擴展錨點:newCapacity = (oldCapacity << 1) + 1 ;threshold = (int)newCapacity * loadFactor; 【oldCapacity=11,loadFactor = 3/4】
hash算法 (key.hashCode() & 0x7FFFFFFF) % tab.length; 沒有做高位混淆
新增一個不存在數據,加在鏈表頭部
不允許有空的key和value;沒有判斷key是否為null 如果傳入key為null編譯時不會報錯,運行時會報空指針異常
方法是同步
TreeMap:
存儲數據的結構是紅黑樹
Java8 HashMap ,hashTable,TreeMap 看源代碼看到的一些特性