hashmap的數(shù)組存的是什么 為什么HashMap的數(shù)組長(zhǎng)度一定是2的次冪?
為什么HashMap的數(shù)組長(zhǎng)度一定是2的次冪?有兩個(gè)原因1。為了查找和添加元素,模塊化操作用于查找數(shù)組下標(biāo)。如果模運(yùn)算是2的n次方,則可以用位運(yùn)算符代替,這樣效率更高。2. 擴(kuò)容方便。如果直接查看源代
為什么HashMap的數(shù)組長(zhǎng)度一定是2的次冪?
有兩個(gè)原因
1。為了查找和添加元素,模塊化操作用于查找數(shù)組下標(biāo)。如果模運(yùn)算是2的n次方,則可以用位運(yùn)算符代替,這樣效率更高。
2. 擴(kuò)容方便。
如果直接查看源代碼,可以看到擴(kuò)展的resize方法的參數(shù)是2*表.長(zhǎng)度(圖中是JDK7的源代碼),也就是說(shuō)每次擴(kuò)容都是容量的兩倍,擴(kuò)容后需要進(jìn)行數(shù)據(jù)遷移。如果初始長(zhǎng)度為2的n次方,則擴(kuò)展將減少數(shù)據(jù)遷移的次數(shù)。
例如,初始長(zhǎng)度為16,將擴(kuò)展到32。位置1中的節(jié)點(diǎn)僅在擴(kuò)展后遷移到位置1和17。實(shí)際上,I位置的節(jié)點(diǎn)只會(huì)遷移到I之前和I擴(kuò)展之后的數(shù)組長(zhǎng)度。
例如,當(dāng)數(shù)組的長(zhǎng)度為16時(shí),它位于1的位置。當(dāng)它擴(kuò)展到32時(shí),它會(huì)被移到17的位置
例如,當(dāng)數(shù)組的長(zhǎng)度為16時(shí),它就在1的位置。當(dāng)它擴(kuò)展到32時(shí),它仍然處于1的位置。
這是主要原因。
順便說(shuō)一下,在源代碼中,如果您不將其設(shè)置為2的n次方,它也將幫助您將其設(shè)置為2的n次方。例如,如果通過(guò)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是非線(xiàn)程安全的,HashMap的線(xiàn)程安全方法是map map=集合.synchronziedMap(New HashMap());哈希表是線(xiàn)程安全的
3。HashMap的默認(rèn)長(zhǎng)度是16,擴(kuò)展是原來(lái)的兩倍;hashtable的默認(rèn)長(zhǎng)度是11,擴(kuò)展是原來(lái)的2n1。HashMap繼承abstractmap;hashtable繼承dictionary
4。擴(kuò)展,HashMap comparison Concurrent HashMap,HashMap vs.sparse,linkedarray vs.ArrayList,ArrayList vs.vector
可以直接運(yùn)行。。。publicstaticvoidmain(String[]args){HashMap<String,Integer>hm=newHashMap<String,Integer>()嗯,普特(“Jack1”,newInteger(1000))嗯,普特(“Jack2”,newInteger(2000))嗯,普特(“Jack3”,newInteger(3000))嗯,普特(“Jack4”,newInteger(4000))Integerlist[]=newInteger[hm.尺寸()]//數(shù)組長(zhǎng)度與收藏。。充滿(mǎn)活力。對(duì)于(I),inti=0ntegerstr:hm.值()){list[i]=stri=1}(intj=0j<list.lengthj長(zhǎng)度){ 系統(tǒng)輸出打?。斜韀j])}