1. 程式人生 > >Java8 HashMap ,hashTable,TreeMap 看源代碼看到的一些特性

Java8 HashMap ,hashTable,TreeMap 看源代碼看到的一些特性

允許 ble class 空指針 沒有 htable 空指針異常 運行 put

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 看源代碼看到的一些特性