hashmap面試擴(kuò)容機(jī)制 hashmap在,擴(kuò)容,時(shí)為什么是乘以2?
hashmap在,擴(kuò)容,時(shí)為什么是乘以2?長(zhǎng)度為2的n次方,取模運(yùn)算可以用位操作h&(length-1)來(lái)求得,這樣效率最高為什么HashMap的數(shù)組長(zhǎng)度一定是2的次冪??jī)蓚€(gè)原因1.查找和增加元
hashmap在,擴(kuò)容,時(shí)為什么是乘以2?
長(zhǎng)度為2的n次方,取模運(yùn)算可以用位操作h&(length-1)來(lái)求得,這樣效率最高
為什么HashMap的數(shù)組長(zhǎng)度一定是2的次冪?
兩個(gè)原因
1.查找和增加元素是使用的取模運(yùn)算來(lái)找到數(shù)組下標(biāo),而取模運(yùn)算如果是對(duì)2的n次冪,那么可以用&位運(yùn)算符代替,效率比較高。
2.擴(kuò)容的時(shí)候方便。
直接看源碼就明白了,擴(kuò)容的resize方法的參數(shù)是2*table.length(圖中是JDK7的源碼),意味著每次擴(kuò)容都是2倍擴(kuò)容,擴(kuò)容之后就需要進(jìn)行數(shù)據(jù)遷移了。如果初始長(zhǎng)度是2的n次冪,擴(kuò)容就會(huì)減少數(shù)據(jù)的遷移次數(shù)。
舉個(gè)例子初始長(zhǎng)度是16,擴(kuò)容到32后。之前在1位置的節(jié)點(diǎn),擴(kuò)容之后之后只會(huì)遷移到1和17的位置,其實(shí)就是之前在i的位置,擴(kuò)容之后只會(huì)在i和i 之前數(shù)組的長(zhǎng)度。
比如17,在數(shù)組長(zhǎng)度是16的時(shí)候,在1的位置,當(dāng)擴(kuò)容到32后,就會(huì)遷移到17的位置
比如1,在數(shù)組長(zhǎng)度是16的時(shí)候,在1的位置,當(dāng)擴(kuò)容到32后,還在1的位置。
主要就是這個(gè)原因了。
順便提下源碼里就是你不設(shè)置為2的n次冪,也會(huì)幫你設(shè)置為2的n次冪,比如說(shuō)你傳15,會(huì)幫你設(shè)置為16的,源碼對(duì)應(yīng)的方法是roundUpToPowerOf2。
希望對(duì)你有幫助??梢躁P(guān)注我,會(huì)分享一些源碼思路的知識(shí)
精通spring全家桶,被15家公司拒絕,大專程序員出路在哪?
看你的情況,說(shuō)明你對(duì)自己還是比較自信,認(rèn)為自己卻掌握了比較全方位的技術(shù),但是在面試過(guò)程中你屢屢碰壁,連續(xù)被多家單位和企業(yè)拒絕,拋開(kāi)他們是否有眼光不說(shuō),這其中肯定有你自己的問(wèn)題。建議你在以下幾個(gè)方面,查找自己面試過(guò)程中的不足。
1.是否把你的能力真正的展示出來(lái)了。
作為技術(shù)員而言,學(xué)歷是一個(gè)方面,可以作為一個(gè)參考,但并不是最重要,最重要的是有實(shí)打?qū)嵉募夹g(shù)。企業(yè)需要的是能夠解決問(wèn)題的技術(shù)員,而不是需要學(xué)歷高的技術(shù)員,這一點(diǎn)是很肯定的,所以你不必過(guò)于在意自己學(xué)歷不高的問(wèn)題。如果是要需要學(xué)歷撐門(mén)面的話,本科研究生或許都什么用,至少也要找一個(gè)專家來(lái)?yè)伍T(mén)面。所以,很有可能是在你在面試的過(guò)程中,你并沒(méi)有把自己的能力真正的完全的展示出來(lái)。
2.是否有自己的代表作品。
企業(yè)在面試的過(guò)程中,通常都會(huì)與應(yīng)聘者進(jìn)行溝通,但是這些溝通都比較宏觀,也是一種感性的認(rèn)識(shí)。你在面試的過(guò)程中,除了你介紹自己的技術(shù)全面之外,如果你能夠拿出自己具有代表性的作品,那么可以增強(qiáng)你的說(shuō)服力,大大增加自己應(yīng)試的籌碼。
3.是否對(duì)自己的工作經(jīng)歷進(jìn)行了系統(tǒng)梳理。
企業(yè)招聘人員的時(shí)候,要在短時(shí)間認(rèn)識(shí)和了解一個(gè)人,本身這是一項(xiàng)難度很高的事情,所以給每個(gè)應(yīng)聘者的時(shí)間并不是很多。那么,你在面試之前,要對(duì)自己的工作經(jīng)歷,取得的業(yè)績(jī)或成果,對(duì)未來(lái)的發(fā)展設(shè)想,進(jìn)行系統(tǒng)全面的梳理,以便于更高效的與相關(guān)的招聘人員進(jìn)行溝通。不能以為自己是理工科類別,干的是技術(shù)活,就不需要梳理和總結(jié)。
祝你能早日找到滿意的工作。
map擴(kuò)容為什么是2倍?
map計(jì)算添加元素的位置時(shí),使用的位運(yùn)算,這是特別高效的運(yùn)算;另外,HashMap的初始容量是2的n次冪,擴(kuò)容也是2倍的形式進(jìn)行擴(kuò)容,是因?yàn)槿萘渴?的n次冪,可以使得添加的元素均勻分布在HashMap中的數(shù)組上,減少hash碰撞,避免形成鏈表的結(jié)構(gòu),使得查詢效率降低。