教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Hashmap和ConcurrentHashmap的區(qū)別【Java培訓(xùn)】

更新時間:2022年09月05日16時54分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

  Hashmap本質(zhì)是數(shù)組加鏈表。根據(jù)key取得hash值,然后計算出數(shù)組下標(biāo),如果多個key對應(yīng)到同一個下標(biāo),就用鏈表串起來,新插入的在前面。

  ConcurrentHashMap:在hashMap的基礎(chǔ)上,ConcurrentHashMap將數(shù)據(jù)分為多個segment(段),默認(rèn)16個(concurrency level),然后每次操作對一個segment(段)加鎖,避免多線程鎖的幾率,提高并發(fā)效率。

  HashMap基于哈希表的 Map 接口的實現(xiàn)。此實現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了不同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順序恒久不變。

  值得注意的是HashMap不是線程安全的,如果想要線程安全的HashMap,可以通過Collections類的靜態(tài)方法synchronizedMap獲得線程安全的HashMap。

  1、ConcurrentHashMap對整個桶數(shù)組進(jìn)復(fù)行了分段制,而HashMap則沒有

  2、ConcurrentHashMap在每一個分段上都用鎖進(jìn)行保護(hù),從而讓鎖的粒度更精細(xì)一些,并發(fā)性能更好,而HashMap沒有zhidao鎖機制,不是線程安全的

  ConcurrentHashMap代碼中可以看出,度它引入了一個“分段鎖”的概念,具體可以理解知為把一個大的Map拆分成N個小的HashTable,根據(jù)key.hashCode()來決定把key放到哪個HashTable中。道

  在ConcurrentHashMap中,就是把Map分成了N個Segment,put和get的時候,都是現(xiàn)根據(jù)key.hashCode()算出放到哪個Segment中

  HashMap的底層主要是基于數(shù)組和鏈表來實現(xiàn)的,它之所以有相當(dāng)快的查詢速度主要是因為它是通過計算散列碼來決定存儲的位置,能夠很快的計算出對象所存儲的位置。HashMap中主要是通過key的hashCode來計算hash值的,只要hashCode相同,計算出來的hash值就一樣。如果存儲的對象對多了,就有可能不同的對象所算出來的hash值是相同的,這就出現(xiàn)了所謂的hash沖突。學(xué)過數(shù)據(jù)結(jié)構(gòu)的同學(xué)都知道,解決hash沖突的方法有很多,HashMap底層是通過鏈表來解決hash沖突的。

0 分享到:
和我們在線交談!