剖析java中hashmap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化

剖析java中hashmap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化

ID:27792404

大?。?66.52 KB

頁(yè)數(shù):10頁(yè)

時(shí)間:2018-12-06

剖析java中hashmap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化_第1頁(yè)
剖析java中hashmap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化_第2頁(yè)
剖析java中hashmap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化_第3頁(yè)
剖析java中hashmap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化_第4頁(yè)
剖析java中hashmap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化_第5頁(yè)
資源描述:

《剖析java中hashmap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫(kù)。

1、剖析Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化這篇文章主要介紹了Java中HashMap數(shù)據(jù)結(jié)構(gòu)的源碼及其性能優(yōu)化,文中以Java8后HashMap的性能提升來(lái)討論了HashMap的一些優(yōu)化點(diǎn),需要的朋友可以參考下存儲(chǔ)結(jié)構(gòu)首先,HashMap是基于哈希表存儲(chǔ)的。它內(nèi)部有一個(gè)數(shù)組,當(dāng)元素要存儲(chǔ)的時(shí)候,先計(jì)算其key的哈希值,根據(jù)哈希值找到元素在數(shù)組中對(duì)應(yīng)的下標(biāo)。如杲這個(gè)位置沒(méi)有元素,就直接把當(dāng)前元素放進(jìn)去,如果有元素了(這里記為A),就把當(dāng)前元素鏈接到元素A的前面,然后把當(dāng)前元素放入數(shù)組屮。所以在Hashmap數(shù)組其實(shí)保存的是鏈表的首節(jié)點(diǎn)。下面是百度百科的一張圖:EntryEn

2、tryEntryKeyKeyEntryValueValueEnttyEntryEntryEntryEnttyEntryEntry如上圖,每個(gè)元素是一個(gè)Entry對(duì)象,在其屮保存了元素的key和value,還有一個(gè)指針可用于指向下一個(gè)對(duì)象。所有哈希值相同的key(也就是沖突了)用鏈表把它們串起來(lái),這是拉鏈法。內(nèi)部變量〃默認(rèn)初始容量staticfinalintDEFAULT_INITIAL_CAPACITY=16;〃最大容量staticfinalintMAXIMUM_CAPACITY=1?30;〃默認(rèn)裝載因子staticfinalfloatDEFAULT_LOAD_FACTOR=0.75

3、f;〃哈希表transientEntry[]table;〃鍵值對(duì)的數(shù)量transientintsize;〃擴(kuò)容的閾值intthreshold;〃哈希數(shù)組的裝載因子finalfloatloadFactor;在上面的變量中,capacity是指哈希表的長(zhǎng)度,也就是table的大小,默認(rèn)為16。裝載因子loadFactor是哈希表的“裝滿程度”,JDK的文檔是這樣說(shuō)的:Theloadfactorisameasureofhowfullthehashtableisallowedtogetbeforeitscapacityisautomaticallyincreased?Whenthe

4、numberofentriesinthehashtableexceedstheproductoftheloadfactorandthecurrentcapacity,thehashtableisrehashed(thatis,internaldatastructuresarerebuilt)sothatthehashtablehasapproximatelytwicethenumberofbuckets?大體意思是:裝載因子是哈希表在擴(kuò)容之前能裝多滿的度量值。當(dāng)哈希表中“鍵值對(duì)”的數(shù)量超過(guò)當(dāng)前容M(capacity)和裝載因子的乘積后,哈希表重新散列(也就是內(nèi)部的數(shù)據(jù)結(jié)構(gòu)重建了),并

5、且哈希表的容量大約變?yōu)樵瓉?lái)的兩倍。從上面的變量定義可以看出,默認(rèn)的裝載因子DEFAULT_LOAD_FACTOR是0.75。這個(gè)值越大,空間利用率越高,但查詢速度(包括get和put)操作會(huì)變慢。明白了裝載因子之后,threshold也就能理解了,它其實(shí)等于容量*裝載因子。構(gòu)造器publicHashMap(intinitialCapacity,floatloadFactor){if(initialcapacity<0)thrownewHlegalArgumentException("lllegalinitialcapacity:"+initialcapacity);if(initia

6、lCapacity>MAXIMUM_CAPACITY)initialcapacity=MAXIMUM_CAPACITY;if(loadFactor<=011Float.isNaN(loadFactor))thrownewHlegalArgumentException("Illegalloadfactor:"+loadFactor);//Findapowerof2>=initialcapacityintcapacity=1;while(capacity

7、ctor;threshold=(int)Math.min(capacity*loadFactor,MAXIMUM_CAPACITY+1);table=newEntry[capacity];〃給哈希表分配空間useAltHashing=sun.misc.VM.isBooted()&&(capacity>=Holder.ALTERNATIVE_HASHING_THRESHOLD);init();}構(gòu)造器有好兒個(gè),最終都會(huì)調(diào)用上面的這個(gè)。它接受兩個(gè)參數(shù),一個(gè)是初

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。