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

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論