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é)