天天看點

Java Map周遊方式的選擇

 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/