Map的高效遍歷

2021-09-01 17:20:26 字數 1412 閱讀 4760

[quote][b]場景:[/b]偶爾生產環境的某台機器cpu使用率很高,經過定位發現是有乙個大的hashmap(hashmap裡面存放了大量資料,比如1w條)做迴圈引起的。[/quote]

**中採用了如下的遍歷

for(iterator ite = map.keyset().iterator(); ite.hasnext();)

通過map類的get(key)方法獲取value時,會進行兩次hashcode的計算,消耗cpu資源;而使用entryset的方式,map物件會直接返回其儲存key-value的原始資料結構物件,遍歷過程無需進行錯誤**中耗費時間的hashcode計算;這在大資料量下,體現的尤為明顯。

以下是hashmap.get()方法的原始碼:

public v get(object key)

return null;

}

正確用法如下:

for(iterator ite = map.entryset().iterator(); ite.hasnext();)

對比測試

public class hashmaptest

} public static void getfrommapbyentryset(map map)

} public static void main(string args)

long currenttime = system.currenttimemillis();

getfrommap(map);

long currenttime2 = system.currenttimemillis();

getfrommapbyentryset(map);

long currenttime3 = system.currenttimemillis();

system.out.println(currenttime2-currenttime);

system.out.println(currenttime3-currenttime2);

} }

執行結果:

16

0

經過對比,可以看到明顯的差別。

還有一種最常用的遍歷方法,其效果也不太好,不建議使用

for(iterator i = map.values().iterator(); i.hasnext();)

[url=

mysql遍歷map中的陣列 遍歷Map的四種方法

public static void main string args map map new hashmap map.put 1 value1 map.put 2 value2 map.put 3 value3 第一種 普遍使用,二次取值 system.out.println 通過map.keys...

Map遍歷的方法

一.遍歷方法 1.只遍歷value for string value map.values 2.keyset遍歷key和value for string key map.keyset 3.entryset使用iterator遍歷key和value iterator it map.entryset i...

Map的遍歷方法

public static void main string args 第二種 system.out.println 通過map.entryset使用iterator遍歷key和value iterator it map.entryset iterator while it.hasnext 第三種 ...