Java中Map的遍歷方法及性能測試_第1頁
Java中Map的遍歷方法及性能測試_第2頁
Java中Map的遍歷方法及性能測試_第3頁
Java中Map的遍歷方法及性能測試_第4頁
Java中Map的遍歷方法及性能測試_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論