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

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

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

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

好口碑IT培訓(xùn)

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

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

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

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

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

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

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

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

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

0 分享到:
和我們?cè)诰€交談!