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才出现的方法,只在较新版本的语言中使用。
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:用迭代器进行遍历
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以前这是唯一的遍历方式。此外,迭代器方式是唯一一种允许你在遍历的同时删除元素的方法(通过调用iterator.remove()
),即forEach方式是不允许你在遍历的同时删除元素的,否则会得到ConcurrentModificationException
。
从性能角度来说,和ForEach方法并没有区别(因为forEach方法本质上还是通过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很类似, 实际上比Method#1慢了20%-200%。FindBugs会发现这个问题并提示Bug,要避免使用这种方法。
结论
如果你只需要keys或者values,使用Method#2就可以了。如果你需要于Java5以前的代码打交道或者打算在迭代的时候删除一些元素,那只能用Method#3.其余情况用方法1就OK了。