卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

hashmap默認(rèn)長度和擴容 map擴容為什么是2倍?

map擴容為什么是2倍?另外,HashMap的初始容量是2的n次方,擴展也是2次方,因為容量是2的n次方,可以使添加的元素均勻分布在HashMap數(shù)組中,減少哈希沖突,避免鏈表結(jié)構(gòu)的形成,降低了查詢效

map擴容為什么是2倍?

另外,HashMap的初始容量是2的n次方,擴展也是2次方,因為容量是2的n次方,可以使添加的元素均勻分布在HashMap數(shù)組中,減少哈希沖突,避免鏈表結(jié)構(gòu)的形成,降低了查詢效率。

hashmap在,擴容,時為什么是乘以2?

對于長度2的n次方,模運算可以通過位運算H&(長度1)獲得,因此效率最高

兩個原因

]1。為了查找和添加元素,模塊化操作用于查找數(shù)組下標(biāo)。如果模運算是2的n次方,則可以用位運算符代替它,這樣效率更高。

2. 擴容方便。

如果直接查看源代碼,可以看到擴展的resize方法的參數(shù)是2*表.長度(圖中是JDK7的源代碼),也就是說每次擴容都是容量的兩倍,擴容后需要進(jìn)行數(shù)據(jù)遷移。如果初始長度為2的n次方,則擴展將減少數(shù)據(jù)遷移的次數(shù)。

例如,初始長度為16,將擴展到32。位置1中的節(jié)點僅在擴展后遷移到位置1和17。實際上,I位置的節(jié)點只會遷移到I之前和I擴展之后的數(shù)組長度。

例如,當(dāng)數(shù)組的長度為16時,它位于1的位置。當(dāng)它擴展到32時,它會被移到17的位置

例如,當(dāng)數(shù)組的長度為16時,它就在1的位置。當(dāng)它擴展到32時,它仍然處于1的位置。

這是主要原因。

順便說一下,在源代碼中,如果您不將其設(shè)置為2的n次方,它也將幫助您將其設(shè)置為2的n次方。例如,如果通過15,它將幫助您將其設(shè)置為16。源代碼的對應(yīng)方法是2的整數(shù)倍。

希望對您有所幫助。你可以跟我分享一些關(guān)于源代碼的想法

1。HashMap支持null鍵和null值;hashtable不允許。這是因為HashMap對null有特殊處理。它將hashcode值null設(shè)置為0,并將其存儲在哈希表的第0個bucket中。

2. HashMap是非線程安全的,HashMap的線程安全方法是map map=集合.synchronziedMap(New HashMap());哈希表是線程安全的

3。HashMap的默認(rèn)長度是16,擴展是原來的兩倍;hashtable的默認(rèn)長度是11,擴展是原來的2n1。HashMap繼承abstractmap;hashtable繼承dictionary

4。擴展,HashMap比較并發(fā)HashMap,HashMap vs.sparse,linkedarray vs.ArrayList,ArrayList vs.vector。。。

沒有容量擴展的示例:

如果10個存儲桶中有1W數(shù)據(jù),并且每個存儲桶平均有1000個數(shù)據(jù),那么即使jdk8中默認(rèn)有8個以上的存儲桶,它也會將您變成一棵紅黑樹,那么您查找元素的平均時間是log(base 2)1000。

另一方面,如果擴容。過程同上,但平均時間會大大縮短。

還有誰說12個會擴大?這只是默認(rèn)值。

JDK文檔明確建議在初始化HashMap時,應(yīng)根據(jù)將來存儲的數(shù)據(jù)量一次性指定其容量和負(fù)載因子。盡量避免擴展(這將導(dǎo)致額外的成本),同時,不要浪費內(nèi)存