entryset周遊key+value(寫法1):
iterator<entry<string, string>> iter = map.entryset().iterator();
entry<string, string> entry;
while (iter.hasnext()) {
entry = iter.next();
key = entry.getkey();
value = entry.getvalue();
}
entryset周遊key+value(寫法2):
for (entry<string, string> entry: map.entryset()) {
2.2.2 周遊key
keyset周遊key(寫法1):
iterator<string> iter = map.keyset().iterator();
key = iter.next();
keyset周遊key(寫法2):
for (string key : map.keyset()) {
entryset周遊key(寫法1):
iterator<entry<string, string>> iter = map.entryset().iterator();
key = iter.next().getkey();
entryset周遊key(寫法2):
2.2.3 周遊value
keyset周遊value(寫法1):
value = map.get(iter.next());
keyset周遊value(寫法2):
value = map.get(key);
entryset周遊value(寫法1):
value = iter.next().getvalue();
entryset周遊value(寫法2):
values周遊value(寫法1):
iterator<string> iter = map.values().iterator();
value = iter.next();
values周遊value(寫法2):
for (string value : map.values()) {
2.3 測試結果
2.3.1 hashmap測試結果
機關:毫秒
hashmap-1
hashmap-2
keyset周遊key+value(寫法1)
39
93
keyset周遊key+value(寫法2)
38
87
entryset周遊key+value(寫法1)
43
86
entryset周遊key+value(寫法2)
85
keyset周遊key(寫法1)
27
65
keyset周遊key(寫法2)
26
64
entryset周遊key(寫法1)
35
75
entryset周遊key(寫法2)
34
74
keyset周遊value(寫法1)
keyset周遊value(寫法2)
37
entryset周遊value(寫法1)
61
entryset周遊value(寫法2)
32
62
values周遊value(寫法1)
48
values周遊value(寫法2)
2.3.2 treemap測試結果
treemap-1
treemap-2
430
451
429
450
77
84
70
68
50
49
66
63
432
448
46
45
3、結論
3.1 如果你使用hashmap
1)同時周遊key和value時,keyset與entryset方法的性能差異取決于key的具體情況,如複雜度(複雜對象)、離散度、沖突率等。換言之,取決于hashmap查找value的開銷。entryset一次性取出所有 key和value的操作是有性能開銷的,當這個損失小于hashmap查找value的開銷時,entryset的性能優勢就會展現出來。例如上述對比測試中,當key是最簡單的數值字元串時,keyset可能反而會更高效,耗時比entryset少10%。總體來說還是推薦使用entryset。因為當key很簡單時,其性能或許會略低于keyset,但卻是可控的;而随着key的複雜化,entryset的優勢将會明顯展現出來。當然,我們可以根據實際情況進行選擇
2)隻周遊key時,keyset方法更為合适,因為entryset将無用的value也給取出來了,浪費了性能和空間。在上述測試結果中,keyset比entryset方法耗時少23%。
3)隻周遊value時,使用vlaues方法是最佳選擇,entryset會略好于keyset方法。
4)在不同的周遊寫法中,推薦使用如下寫法,其效率略高一些:
3.2 如果你使用treemap
1)同時周遊key和value時,與hashmap不同,entryset的性能遠遠高于keyset。這是由treemap的查詢效率決定的,也就是說,treemap查找value的開銷較大,明顯高于entryset一次性取出所有key和value的開銷。是以,周遊treemap時強烈推薦使用entryset方法。
2)隻周遊key時,keyset方法更為合适,因為entryset将無用的value也給取出來了,浪費了性能和空間。在上述測試結果中,keyset比entryset方法耗時少24%。
3)隻周遊value時,使用vlaues方法是最佳選擇,entryset也明顯優于keyset方法。
最新内容請見作者的github頁:http://qaseven.github.io/