HashTable與Collections.synchronizedMap()

HashTable與Collections.synchronizedMap()

hashtable基本已經(jīng)不推薦使用了,這里簡(jiǎn)單介紹一下經(jīng)常被問(wèn)到的問(wèn)題

  • hashtable底層結(jié)構(gòu)?
    • 與hashmap類似,數(shù)組+鏈表的形式,不同的是在幾乎每個(gè)方法都加上了synchronized,保證同步安全
    • 初始容量為11,如果傳入容量初始值,那就直接用,不會(huì)擴(kuò)充為2的冪次
    • 每次擴(kuò)容擴(kuò)為原來(lái)的2*n+1
  • hashtable為什么不推薦使用了?
    • 因?yàn)槊總€(gè)方法都加上同步,會(huì)讓效率變得很低
  • 那你推薦用什么?
    • 可以使用ConcurrentHashMap或者Collections.SynchronizedMap()
  • ConcurrentHashMap可以完全替代HashTable么?
    • 不可以1.7的ConcurrentHashMap是弱一致性,HashTable是強(qiáng)一致性,比如想找到集合中最大的元素,可能chm在這個(gè)段中找到了,但是另一個(gè)段同時(shí)修改了數(shù)據(jù),最大值出現(xiàn)在了另一個(gè)個(gè)段,這就是由于分段鎖的存在
    • 自我感覺(jué)1.8的ConcurrentHashMap貌似已經(jīng)完全可以了
  • 談?wù)凜ollections.synchronizedMap()吧,他和hashtable有什么區(qū)別
    • hashtable鎖級(jí)別是方法級(jí)別的,Collections.synchronizedMap()是代碼塊級(jí)別的鎖方法,并且可以鎖對(duì)象
    • 兩者性能相近,但是Collections.synchronizedMap()允許null作為key或value(鎖對(duì)象),這個(gè)時(shí)候只允許同時(shí)存在一個(gè)操作,有點(diǎn)串行化的感覺(jué)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容