Map 筆記
今天學習了 map 中的 hashMap 和 concurrentHashMap 區別,簡單記錄下。數組
1.JDk1.7
hashmap:安全
- hashmap 是數組和鏈表的組合結構,線程不安全
- hashmap 默認長度爲 16,默認加載因子爲 0.75,hashmap 添加數據時,添加後的長度大於等於原來長度*加載因子時會擴容,默認增長爲原來的 2 倍
- hashmap 指定長度和加載因子初始化構造方法時,hashmap 的長度初始化爲大於等於指定長度的 2 的次方的值
- hashmap 的長度老是爲 2 的次方,主要是爲了方便經過尋找到 entry 對象存在那個數組節點。
- put() 方法操做時,先經過 hashcode 位運算和與運算後獲得 hash,再經過 hash & (hashmap長度-1) 尋找到entry對象存在那個數組節點,而後獲得這個節點存放的鏈表,若是爲 null,直接存放,若是不爲 null,則經過 key 判斷是否有本身存放的 key 的 entry,有直接替換 value,返回 oldvalue,若是沒有判斷鏈表長度,最後放在鏈表頭部,而後存放鏈表原來頭部 entry 的下標 next,鏈表下移
- 擴容時,數組元素中鏈表的順序和原來存放的順序恰好相反,而且會出現死循環的問題
hashtable:線程安全,給 put() 方法加了個 synchronized,效率慢
concurrentHashMap: 構造方法中比 hashmap 多個級別level的參數,該 map 把一個entry數組分爲了 level 個,segment,而且每一個都加鎖,每一個 segment 的長度爲 map 的長度/level學習
2.JDK1.8
hashmap:
相對於 jdk1.7 的區別:線程
- put() 方法插入元素,追加在鏈表的尾部,而不是插入頭部再向下移動一位
- 鏈表長度大於等於8時會樹化爲紅黑樹結構
concurrentHashMap:
相對於 jdk1.7 的區別:沒有了 segment。由於每次操做都會設計鏈表的第一個元素,因此只給鏈表第一位元素加鎖設計
若是有哪些不對的地方煩請指認,先行感謝