1. 程式人生 > >JAVA之map

JAVA之map

算法 一個數 就是 idt span .com mov bubuko 占用

1,hashmap,hashtable,ConcurrentHashMap

考問點1,hashmap的數據結構,其數據結構為數組+鏈表,把key進過hash算法得到hashcode, 然後hashcode%數組大小,得到數組相應的位置然後存放,

不同的key進過hash和取模可能會得到相同的數組位置,這就是沖突了,一個數組位置放不下多個數據,這時候就引入了鏈表。

技術分享圖片

數組長度是根據鏈表長度而擴張,鏈表太長就會帶來性能問題,當超過一定長度就變成紅黑樹,查找起來更快。

技術分享圖片

於 JDK 1.8 中引入了紅黑樹,底層數據結構由數組+鏈表變為了數組+鏈表+紅黑樹,不過本質並未變。

考問點2

,三個map 在多線程中的表現,map的兩個操作put 和 get ,先看hashtable get 和 put方法前面都加入了 synchronized

所以說hashtable是線程安全的,hashmap沒有synchronized修飾所以線程不安全。

ConcurrentHashMap是使用了鎖分段技術來保證線程安全的。鎖分段技術:首先將數據分成一段一段的存儲,然後給每一段數據配一把鎖,當一個線程占用鎖訪問其中一個段數據的時候,其他段的數據也能被其他線程訪問。

ConcurrentHashMap提供了與Hashtable和SynchronizedMap不同的鎖機制。Hashtable中采用的鎖機制是一次鎖住整個hash表,從而在同一時刻只能由一個線程對其進行操作;而ConcurrentHashMap中則是一次鎖住一個桶。

ConcurrentHashMap默認將hash表分為16個桶,諸如get、put、remove等常用操作只鎖住當前需要用到的桶。這樣,原來只能一個線程進入,現在卻能同時有16個寫線程執行,並發性能的提升是顯而易見的。

技術分享圖片

圖片來自網絡轉載

JAVA之map