Map簡單記錄

Map 筆記

今天學習了 map 中的 hashMap 和 concurrentHashMap 區別,簡單記錄下。

1.JDk1.7

hashmap:

  1. hashmap 是數組和鏈表的組合結構,線程不安全
  2. hashmap 默認長度爲 16,默認加載因子爲 0.75,hashmap 添加數據時,添加後的長度大於等於原來長度*加載因子時會擴容,默認增加爲原來的 2 倍
  3. hashmap 指定長度和加載因子初始化構造方法時,hashmap 的長度初始化爲大於等於指定長度的 2 的次方的值
  4. hashmap 的長度總是爲 2 的次方,主要是爲了方便通過尋找到 entry 對象存在那個數組節點。
  5. put() 方法操作時,先通過 hashcode 位運算和與運算後得到 hash,再通過 hash & (hashmap長度-1) 尋找到entry對象存在那個數組節點,然後得到這個節點存放的鏈表,如果爲 null,直接存放,如果不爲 null,則通過 key 判斷是否有自己存放的 key 的 entry,有直接替換 value,返回 oldvalue,如果沒有判斷鏈表長度,最後放在鏈表頭部,然後存放鏈表原來頭部 entry 的下標 next,鏈表下移
  6. 擴容時,數組元素中鏈表的順序和原來存放的順序剛好相反,並且會出現死循環的問題

    hashtable:線程安全,給 put() 方法加了個 synchronized,效率慢
    concurrentHashMap: 構造方法中比 hashmap 多個級別level的參數,該 map 把一個entry數組分爲了 level 個,segment,並且每個都加鎖,每個 segment 的長度爲 map 的長度/level

2.JDK1.8

hashmap:
相對於 jdk1.7 的區別:

  1. put() 方法插入元素,追加在鏈表的尾部,而不是插入頭部再向下移動一位
  2. 鏈表長度大於等於8時會樹化爲紅黑樹結構

concurrentHashMap:
相對於 jdk1.7 的區別:沒有了 segment。因爲每次操作都會設計鏈表的第一個元素,所以只給鏈表第一位元素加鎖

如果有哪些不對的地方煩請指認,先行感謝
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章