hashmap怎么擴(kuò)容 為什么HashMap的數(shù)組長度一定是2的次冪?
為什么HashMap的數(shù)組長度一定是2的次冪?有兩個(gè)原因1。為了查找和添加元素,模塊化操作用于查找數(shù)組下標(biāo)。如果模運(yùn)算是2的n次方,則可以用位運(yùn)算符代替,這樣效率更高。2. 擴(kuò)容方便。如果直接查看源代
為什么HashMap的數(shù)組長度一定是2的次冪?
有兩個(gè)原因
1。為了查找和添加元素,模塊化操作用于查找數(shù)組下標(biāo)。如果模運(yùn)算是2的n次方,則可以用位運(yùn)算符代替,這樣效率更高。
2. 擴(kuò)容方便。
如果直接查看源代碼,可以看到擴(kuò)展的resize方法的參數(shù)是2*表.長度(圖中是JDK7的源代碼),也就是說每次擴(kuò)容都是容量的兩倍,擴(kuò)容后需要進(jìn)行數(shù)據(jù)遷移。如果初始長度為2的n次方,則擴(kuò)展將減少數(shù)據(jù)遷移的次數(shù)。
例如,初始長度為16,將擴(kuò)展到32。位置1中的節(jié)點(diǎn)僅在擴(kuò)展后遷移到位置1和17。實(shí)際上,I位置的節(jié)點(diǎn)只會(huì)遷移到I之前和I擴(kuò)展之后的數(shù)組長度。
例如,當(dāng)數(shù)組的長度為16時(shí),它位于1的位置。當(dāng)它擴(kuò)展到32時(shí),它會(huì)被移到17的位置
例如,當(dāng)數(shù)組的長度為16時(shí),它就在1的位置。當(dāng)它擴(kuò)展到32時(shí),它仍然處于1的位置。
這是主要原因。
順便說一下,在源代碼中,如果您不將其設(shè)置為2的n次方,它也將幫助您將其設(shè)置為2的n次方。例如,如果通過15,它將幫助您將其設(shè)置為16。源代碼的對(duì)應(yīng)方法是2的整數(shù)倍。
希望對(duì)您有所幫助。你可以跟我分享一些關(guān)于源代碼的想法
1。HashMap支持null鍵和null值;hashtable不允許。這是因?yàn)镠ashMap對(duì)null有特殊處理。它將hashcode值null設(shè)置為0,并將其存儲(chǔ)在哈希表的第0個(gè)bucket中。
2. HashMap是非線程安全的,HashMap的線程安全方法是map map=集合.synchronziedMap(New HashMap());哈希表是線程安全的
3。HashMap的默認(rèn)長度是16,擴(kuò)展是原來的兩倍;hashtable的默認(rèn)長度是11,擴(kuò)展是原來的2n1。HashMap繼承abstractmap;hashtable繼承dictionary
4。擴(kuò)展名,HashMap comparison Concurrent HashMap,HashMap comparison SparseArray,linkedarray vs ArrayList,ArrayList vs vector
長度2的n次方,可通過位運(yùn)算H&(長度-1)獲得模運(yùn)算,所以效率最高
map在計(jì)算添加元素的位置時(shí)使用位運(yùn)算,效率特別高。另外,HashMap的初始容量是2的n次方,擴(kuò)展也是2倍,因?yàn)槿萘渴?的n次方,可以使添加的元素均勻分布在HashMap數(shù)組中,減少哈希沖突,避免鏈表結(jié)構(gòu)的形成,降低查詢效率。
HashTable和HashMap區(qū)別?
就是這么說的。。。
沒有容量擴(kuò)展的示例:
如果10個(gè)存儲(chǔ)桶中有1W數(shù)據(jù),并且每個(gè)存儲(chǔ)桶平均有1000個(gè)數(shù)據(jù),那么即使jdk8中默認(rèn)有8個(gè)以上的存儲(chǔ)桶,它也會(huì)將您變成一棵紅黑樹,那么您查找元素的平均時(shí)間是log(base 2)1000。
另一方面,如果擴(kuò)容。過程同上,但平均時(shí)間會(huì)大大縮短。
還有誰說12個(gè)會(huì)擴(kuò)大?這只是默認(rèn)值。
JDK文檔明確建議在初始化HashMap時(shí),應(yīng)根據(jù)將來存儲(chǔ)的數(shù)據(jù)量一次性指定其容量和負(fù)載因子。盡量避免擴(kuò)展(這將導(dǎo)致額外的成本),同時(shí),它不應(yīng)該浪費(fèi)內(nèi)存
你好,我很高興回答你的問題。
如果你是某個(gè)單位的公職人員,你的親戚朋友經(jīng)常來找你打聽單位的內(nèi)部事務(wù)。如果你有什么事需要你幫忙,你應(yīng)該怎么處理?][真題]愛狗協(xié)會(huì)人士反映,最近他們用200條狗堵了一輛車,網(wǎng)上批評(píng)劉胡蘭、邱少云、瑯琊山五杰等中國抗日英雄的言論很多。你覺得這個(gè)怎么樣?]【真題】近年來,釋放積德的行為層出不窮,但最近有人放生老鼠。你怎么認(rèn)為?
面試題還有很多其他意思,小編不會(huì)一一列出,如果你有興趣,可以去sd.offcn.com網(wǎng)站學(xué)習(xí)。