1枝冀、hashMap
HashMap數(shù)據(jù)結(jié)構(gòu):根據(jù)key的hashCode來計算hash值密任,只要hashCode相同,計算出來的hash值就一樣塞颁。出現(xiàn)hash沖突,就采用鏈表的方式吸耿,將相同hash值的對象用鏈表連接祠锣。
HashMap存取:put新元素時咽安,首先根據(jù)key的hashCode重新計算hash值(二次hash)伴网,根據(jù)這個新的hash值得到這個元素在數(shù)組的位置(下標),如果數(shù)組已經(jīng)存放其他元素妆棒,那么該位置元素以鏈表形式存放澡腾,新加入的放鏈頭沸伏,最先加入的在鏈尾。根據(jù)Key的hashCode二次hash的算法函數(shù)hash(int h)动分,此方法加入了高位計算馋评,防止低位不變而高位變化時造成的hash沖突。函數(shù)的具體實現(xiàn)如下(>>>表示右移1位并忽略符號位刺啦,空位以0補齊。而>>表示右移不忽略符號位纠脾,即相當于除以2):
2 ConcurrentHashMap
在HashMap的基礎(chǔ)上,ConcurrentHashMap將數(shù)據(jù)分為多個segment玛瘸,默認16個,然后每次操作對一個segment加鎖苟蹈,避免多線程鎖的幾率糊渊,提高并發(fā)效率。
3 Hashtable和HashMap的區(qū)別
HashMap父類為AbstractMap慧脱,方法不同步渺绒,K,V可為null菱鸥,添加新的kv宗兼,若k相同,則將新的v覆蓋氮采。
HashTable父類為Dictionary殷绍,方法同步,k鹊漠,v不可為null主到,添加新的kv,若k相同躯概,則將新的v覆蓋登钥。