Method#1: 以forEach形式遍歷entries
這是最常用的方法。如果你需要key和value的時候就用這個方法吧陕悬。
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
注意這是Java5才出現(xiàn)的方法碴犬,只在較新版本的語言中使用絮宁。
Method#2: 以forEach形式遍歷key或者value
如果你只需要key或者value的時候就用keySet()
或者 values()
代替entrySet()
。
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
//iterating over keys only
for (Integer key : map.keySet()) {
System.out.println("Key = " + key);
}
//iterating over values only
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
相比Method1,這個方法帶來了約10%的性能提升并且代碼顯得更整潔服协。
Method#3:用迭代器進(jìn)行遍歷
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
同理可以遍歷keySet()
和values()
看起來好像是冗余的绍昂,但是前面說過,在Java5以前這是唯一的遍歷方式。此外窘游,迭代器方式是唯一一種允許你在遍歷的同時刪除元素的方法(通過調(diào)用iterator.remove()
),即forEach方式是不允許你在遍歷的同時刪除元素的卖陵,否則會得到ConcurrentModificationException
。
從性能角度來說张峰,和ForEach方法并沒有區(qū)別(因?yàn)閒orEach方法本質(zhì)上還是通過Iterator
遍歷的)
Method#4: 遍歷keys并查找value(效率很差)
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key = " + key + ", Value = " + value);
}
//iterating over values only
for (Integer value : map.values()) {
System.out.println("Value = " + value);
}
看起來和Method#1很類似, 實(shí)際上比Method#1慢了20%-200%棒旗。FindBugs會發(fā)現(xiàn)這個問題并提示Bug喘批,要避免使用這種方法。
結(jié)論
如果你只需要keys或者values铣揉,使用Method#2就可以了饶深。如果你需要于Java5以前的代碼打交道或者打算在迭代的時候刪除一些元素,那只能用Method#3.其余情況用方法1就OK了逛拱。