版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、java中map的遍歷方法及性能測(cè)試這篇文章主要介紹了 java中map的遍歷方法及性能測(cè)試,本文講解對(duì)hashmap> treemap進(jìn) 行對(duì)比測(cè)試,給岀測(cè)試代碼、測(cè)試結(jié)果和測(cè)試結(jié)論,需要的朋友可以參考下1闡述對(duì)于java中map的遍歷方式,很多文章都推薦使用entryset,認(rèn)為其比keyset的效率高很 多。理由是:entryset方法一次拿到所有key和value的集合;而keyset拿到的只是key的 集合,針對(duì)每個(gè)key,都要去map中額外查找一次value,從而降低了總體效率。那么實(shí)際 情況如何呢?為了解遍歷性能的真實(shí)差距,包括在遍歷key+value>遍歷key、遍
2、歷value等不同場(chǎng)景下的 差異,我試著進(jìn)行了一些對(duì)比測(cè)試。2.對(duì)比測(cè)試一開始只進(jìn)行了簡(jiǎn)單的測(cè)試,但結(jié)果卻表明keyset的性能更好,這一點(diǎn)讓我很是費(fèi)解,不 都說entryset明顯好于keyset嗎?為了進(jìn)一步地進(jìn)行驗(yàn)證,于是采用了不同的測(cè)試數(shù)據(jù)進(jìn) 行更詳細(xì)的對(duì)比測(cè)試。2.1測(cè)試數(shù)據(jù)2.1.1 hashmap測(cè)試數(shù)據(jù)hashmap-1,大小為 100 萬(wàn),key 和 value 均為 string, key 的值為 1、2、31000000:復(fù)制代碼代碼如下:map<string, string> map = new hashmap<string, string>()
3、; string key, value;for (i = 1; i <= num; i+) key = ,n + i;value = "value"map.putfkey, value);hashmap-2,大小為 100 萬(wàn),key 和 value 均為 string, key 的值為 50、100> 250、200、50000000:復(fù)制代碼代碼如下:map<string, string> map = new hashmap<string, strjng>();string key, value;for (i = 1; i <=
4、 num; i+) key = "" + (i * 50);value = “value"map.put(key, value);2.1.2 treemap測(cè)試數(shù)據(jù)treemap-1,大小為 100 7j, key 和 value 均為 string, key 的值為 1、2、31000000:復(fù)制代碼代碼如下:map<string, string> map = new treemap<string, string>();string key, value;for (i = 1; i <= num; i+) key = ,h + i;
5、value = “value"map.put(key, value);treemap-2,大小為 100 萬(wàn),key 和 value 均為 string, key 的值為 50、100. 150、200、 50000000,更離散:復(fù)制代碼代碼如下:map<string, string> map = new treemap<string, string>();string key, value;for (i = 1; i <= num; i+) key = ,u + (i * 50);value = "value"map.put(ke
6、y, value);2.2測(cè)試場(chǎng)景分別使用keyset> entryset和values的多種寫法測(cè)試三種場(chǎng)景:遍歷key+value>遍歷key> 遍歷value的場(chǎng)景。2.2.1 遍歷 key+valuekeyset 遍歷 key+value (寫法 1):復(fù)制代碼代碼如下:lterator<string> iter = map.keyset().iterator();while (iter.hasnextf) key = iter. next();value = map.get(key);keyset 遍歷 key+value (寫法 2 ):復(fù)制代碼代碼如
7、下:for (string key : map.keyset() value = map.get(key);entryset 遍歷 key+value (寫法 1):復(fù)制代碼代碼如下:lterator<entryvstring, string>> iter = map.entryset()iterator();entry<string, string> entry;while (iter.hasnext() entry = iter. next();key = en try.getkey();value = en try.getvalue();entryset 遍
8、歷 key+value (寫法 2):復(fù)制代碼代碼如下:for (entry<string, string> entry: map.entryset() key = en try.getkey();value = entry.getvalue();2.2.2 遍歷 keykeyset 遍歷 key (寫法 1):復(fù)制代碼代碼如下:lterator<string> iter = map.keyset().iterator(); while (iter.hasnext() key = iter.next(); keyset 遍歷 key (寫法 2):復(fù)制代碼代碼如下:fo
9、r (string key : map.keyset() entryset 遍歷 key (寫法 1):復(fù)制代碼代碼如下:lterator<entryvstring, string>> iter = map.entryset().iterator(); while (iter.hasnext() key = iter.next().getkey();entryset 遍歷 key (寫法 2 ):復(fù)制代碼代碼如下:for (entry<string, string> entry: map.entryset() key = en try.getkey();2.2.3
10、 遍歷 valuekeyset 遍歷 value (寫法 2):復(fù)制代碼代碼如下:lterator<string> iter = map.keyset().iterator(); while (iter.hasnext() value = map.get(iter. next(); keyset 遍歷 value (寫法 2):復(fù)制代碼代碼如下:for (string key : map.keyset() value = map.get(key); entryset 遍歷 value (寫法 1):復(fù)制代碼代碼如下:lterator<entryvstring, string&
11、gt;> iter = map.entryset()iterator(); while (iter.hasnext() value = iter. next()getvalue();entryset 遍歷 value (寫法 2):復(fù)制代碼代碼如下:for (entry<string, string> entry: map.entryset() value = entry.getvaluef);values 遍歷 value (寫法 2):復(fù)制代碼代碼如下:lterator<string> iter = map.values().iterator!); while
12、 (iter.hasnextf) value = iter. next();values 遍歷 value (寫法 2):復(fù)制代碼代碼如下:for (string value : map.values() 2.3測(cè)試結(jié)果2.3.1 hashmap測(cè)試結(jié)果單位:毫秒hashmap-1hashmap-2keyset 遍歷 key+value (寫法 1)3993keyset 遍歷 key+value (寫法 2)3887entryset 遍歷 key+value (寫法 1)4386單位:毫秒hashmap-lhashmap-2keyset遍歷key (寫法1)2765keyset遍歷key (寫
13、法2 )2664entryset 遍歷 key (寫法 2)3474單位:毫秒hashmap-1hashmap-2keyset 遍歷 value (寫法 1)3887entryset 遍歷 value (寫法 1)3461entryset 遍歷 value (寫法 2)3262values 遍歷 value (寫法 1)2648values 遍歷 value (寫法 2)262.3.2 treemap測(cè)試結(jié)果單位:毫秒treemap-1treemap-2keyset 遍歷 key+value (寫法 1)430451keyset 遍歷 key+value (寫法 2)429450entryse
14、t 遍歷 key+value (寫法 1)77847068單位:毫秒treemap-1treemap-2keyset遍歷key (寫法1)5049keyset遍歷key (寫法2)49486664entryset 遍歷 key (寫法 2 )6563單位:毫秒treemap-1treemap-2keyset 遍歷 value (寫法 1)432448448entryset 遍歷 value (寫法 1)6261entryset 遍歷 value (寫法 2)6261values 遍歷 value (寫法 1)46463. 結(jié)論 3.1如果你使用hashmap1. 同時(shí)遍歷key和value時(shí),
15、keyset與entryset方法的性能差異取決于key的具體情況,如 復(fù)雜度(復(fù)雜對(duì)彖)、離散度、沖突率等。換言之,取決于hashmap查找value的開銷。 entryset 一次性取出所有key和value的操作是有性能開銷的,當(dāng)這個(gè)損失小于hashmap查 找value的開銷時(shí),entryset的性能優(yōu)勢(shì)就會(huì)體現(xiàn)出來(lái)。例如上述對(duì)比測(cè)試中,當(dāng)key是最 簡(jiǎn)單的數(shù)值字符串時(shí),keyset nj'能反而會(huì)更高效,耗時(shí)比entryset少10%??傮w來(lái)說還是推 薦使用entryseto因?yàn)楫?dāng)key很簡(jiǎn)單時(shí),其性能或許會(huì)略低于keyset,但卻是可控的;而隨 著key的復(fù)雜化,entry
16、set的優(yōu)勢(shì)將會(huì)明顯體現(xiàn)出來(lái)。當(dāng)然,我們可以根據(jù)實(shí)際情況進(jìn)行選 擇2只遍歷key時(shí),keyset方法更為合適,因?yàn)閑ntryset將無(wú)用的value也給取出來(lái)了,浪費(fèi) 了性能和空間。在上述測(cè)試結(jié)果中,keyset比entryset方法耗時(shí)少23%。3. 只遍歷value時(shí),使用vlaues方法是最佳選擇,entryset會(huì)略好于keyset方法。4. 在不同的遍歷寫法中,推薦使用如下寫法,其效率略高一些:復(fù)制代碼代碼如下:for (string key : map.keyset() value = map.get(key);for (entry<string, string> en
17、try: map.entryset() key = en try.getkey();value = en try.getvalue();for (string value : map.values() 3.2如果你使用treemap1.同時(shí)遍歷key和value時(shí),與hashmap不同,entryset的性能遠(yuǎn)遠(yuǎn)高于keyset。這是由 treemap的查詢效率決定的,也就是說,treemap查找value的開銷較大,明顯高于entryset 一次性取出所有key和value的開銷。因此,遍歷treemap時(shí)強(qiáng)烈推薦使用entryset方法。2. 只遍歷key時(shí),keyset方法更為合適,因?yàn)閑ntryset將無(wú)用的value也給取出來(lái)了,浪費(fèi) 了性能和空間。在上述測(cè)試結(jié)果中,keyset比entryset方法耗吋少24%。3. 只
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 車間安全培訓(xùn)試題【考點(diǎn)梳理】
- 公司項(xiàng)目部管理人員安全培訓(xùn)試題及答案高清
- 餐飲配送食品留樣與監(jiān)控制度
- 藝術(shù)學(xué)校作品展教研活動(dòng)方案
- 地鐵機(jī)電設(shè)備維護(hù)應(yīng)急預(yù)案
- 城市揚(yáng)塵控制與治理專項(xiàng)方案
- 項(xiàng)目部安全管理人員安全培訓(xùn)試題【易錯(cuò)題】
- 年度啶蟲咪戰(zhàn)略市場(chǎng)規(guī)劃報(bào)告
- 普冉煤礦水資源保護(hù)方案
- 現(xiàn)在企業(yè)文化培訓(xùn)
- 執(zhí)行力培訓(xùn)員工執(zhí)行力培訓(xùn)PPT
- 學(xué)校辦學(xué)方向
- 優(yōu)撫年審標(biāo)題
- 民辦小學(xué)招生方案
- 神經(jīng)外科標(biāo)準(zhǔn)護(hù)理的計(jì)劃范文
- 青少年情緒管理
- GH-T 1384-2022 大麥青汁粉標(biāo)準(zhǔn)
- 山地旅游問卷調(diào)查
- 《大學(xué)生就業(yè)指導(dǎo)》課件-大學(xué)生職業(yè)素養(yǎng)
- 廣東省華南師范大學(xué)附中2023-2024學(xué)年高一上學(xué)期期中生物試題(解析版)
- 南京玄武區(qū)某校2023-2024四年級(jí)上冊(cè)數(shù)學(xué)期中試卷及答案
評(píng)論
0/150
提交評(píng)論