版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、java中map的遍歷方法及性能測試這篇文章主要介紹了 java中map的遍歷方法及性能測試,本文講解對hashmap> treemap進(jìn) 行對比測試,給岀測試代碼、測試結(jié)果和測試結(jié)論,需要的朋友可以參考下1闡述對于java中map的遍歷方式,很多文章都推薦使用entryset,認(rèn)為其比keyset的效率高很 多。理由是:entryset方法一次拿到所有key和value的集合;而keyset拿到的只是key的 集合,針對每個key,都要去map中額外查找一次value,從而降低了總體效率。那么實際 情況如何呢?為了解遍歷性能的真實差距,包括在遍歷key+value>遍歷key、遍
2、歷value等不同場景下的 差異,我試著進(jìn)行了一些對比測試。2.對比測試一開始只進(jìn)行了簡單的測試,但結(jié)果卻表明keyset的性能更好,這一點讓我很是費解,不 都說entryset明顯好于keyset嗎?為了進(jìn)一步地進(jìn)行驗證,于是采用了不同的測試數(shù)據(jù)進(jìn) 行更詳細(xì)的對比測試。2.1測試數(shù)據(jù)2.1.1 hashmap測試數(shù)據(jù)hashmap-1,大小為 100 萬,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 萬,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測試數(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 萬,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測試場景分別使用keyset> entryset和values的多種寫法測試三種場景:遍歷key+value>遍歷key> 遍歷value的場景。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測試結(jié)果2.3.1 hashmap測試結(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測試結(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. 同時遍歷key和value時,
15、keyset與entryset方法的性能差異取決于key的具體情況,如 復(fù)雜度(復(fù)雜對彖)、離散度、沖突率等。換言之,取決于hashmap查找value的開銷。 entryset 一次性取出所有key和value的操作是有性能開銷的,當(dāng)這個損失小于hashmap查 找value的開銷時,entryset的性能優(yōu)勢就會體現(xiàn)出來。例如上述對比測試中,當(dāng)key是最 簡單的數(shù)值字符串時,keyset nj'能反而會更高效,耗時比entryset少10%??傮w來說還是推 薦使用entryseto因為當(dāng)key很簡單時,其性能或許會略低于keyset,但卻是可控的;而隨 著key的復(fù)雜化,entry
16、set的優(yōu)勢將會明顯體現(xiàn)出來。當(dāng)然,我們可以根據(jù)實際情況進(jìn)行選 擇2只遍歷key時,keyset方法更為合適,因為entryset將無用的value也給取出來了,浪費 了性能和空間。在上述測試結(jié)果中,keyset比entryset方法耗時少23%。3. 只遍歷value時,使用vlaues方法是最佳選擇,entryset會略好于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.同時遍歷key和value時,與hashmap不同,entryset的性能遠(yuǎn)遠(yuǎn)高于keyset。這是由 treemap的查詢效率決定的,也就是說,treemap查找value的開銷較大,明顯高于entryset 一次性取出所有key和value的開銷。因此,遍歷treemap時強烈推薦使用entryset方法。2. 只遍歷key時,keyset方法更為合適,因為entryset將無用的value也給取出來了,浪費 了性能和空間。在上述測試結(jié)果中,keyset比entryset方法耗吋少24%。3. 只
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版廣東省土地估價師協(xié)會土地估價師職業(yè)資格認(rèn)證合同3篇
- 科技孵化器在創(chuàng)新創(chuàng)業(yè)中的支持與服務(wù)
- 2024藥店倉儲物流人員勞動合同范本:藥店倉儲合同3篇
- 二零二五年度高標(biāo)準(zhǔn)大棚建設(shè)與配套設(shè)施合同3篇
- 二零二五年度大連離婚協(xié)議書專業(yè)起草與備案合同4篇
- 個性化電商倉儲物流自動化升級合同(2024版)3篇
- 2025年度汽車安全帶保養(yǎng)與更換服務(wù)合同4篇
- 2025年度拆遷房買賣合同書(含環(huán)保節(jié)能要求)4篇
- 二零二五年度打樁施工合同履約保證金協(xié)議3篇
- 2025年度汽車報廢回收處理合同示范4篇
- 2024-2030年中國海泡石產(chǎn)業(yè)運行形勢及投資規(guī)模研究報告
- 動物醫(yī)學(xué)類專業(yè)生涯發(fā)展展示
- 2024年同等學(xué)力申碩英語考試真題
- 消除“艾梅乙”醫(yī)療歧視-從我做起
- 非遺文化走進(jìn)數(shù)字展廳+大數(shù)據(jù)與互聯(lián)網(wǎng)系創(chuàng)業(yè)計劃書
- 科普知識進(jìn)社區(qū)活動總結(jié)與反思
- 現(xiàn)金日記賬模板(帶公式)
- 消化內(nèi)科??票O(jiān)測指標(biāo)匯總分析
- 混凝土結(jié)構(gòu)工程施工質(zhì)量驗收規(guī)范
- 肝性腦病患者的護(hù)理措施課件
- 大跨度斜拉橋上部結(jié)構(gòu)施工技術(shù)(圖文并茂)
評論
0/150
提交評論