共计 1781 个字符,预计需要花费 5 分钟才能阅读完成。
导读 | 在 java 中遍历 Map 有不少的方法。我们看一下最常用的方法及其优缺点。既然 java 中的所有 map 都实现了 Map 接口,以下方法适用于任何 map 实现(HashMap, TreeMap, LinkedHashMap, Hashtable, 等等)。 |
这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。
Map map = new HashMap();
for (Map.Entry entry : map.entrySet()) {System.out.println("Key =" + entry.getKey() + ", Value =" + entry.getValue());
}
注意:for-each 循环在 java 5 中被引入所以该方法只能应用于 java 5 或更高的版本中。如果你遍历的是一个空的 map 对象,for-each 循环将抛出 NullPointerException,因此在遍历前你总是应该检查空引用。
如果只需要 map 中的键或者值,你可以通过 keySet 或 values 来实现遍历,而不是用 entrySet。
Map map = new HashMap();
// 遍历 map 中的键
for (Integer key : map.keySet()) {System.out.println("Key =" + key);
}
// 遍历 map 中的值
for (Integer value : map.values()) {System.out.println("Value =" + value);
}
该方法比 entrySet 遍历在性能上稍好(快了 10%),而且代码更加干净。
使用泛型:
Map map = new HashMap();
Iterator> entries = map.entrySet().iterator();
while (entries.hasNext()) {Map.Entry entry = entries.next();
System.out.println("Key =" + entry.getKey() + ", Value =" + entry.getValue());
}
不使用泛型:
Map map = new HashMap();
Iterator entries = map.entrySet().iterator();
while (entries.hasNext()) {Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key =" + key + ", Value =" + value);
}
你也可以在 keySet 和 values 上应用同样的方法。
该种方式看起来冗余却有其优点所在。首先,在老版本 java 中这是惟一遍历 map 的方式。另一个好处是,你可以在遍历时调用 iterator.remove()来删除 entries,另两个方法则不能。根据 javadoc 的说明,如果在 for-each 遍历中尝试使用此方法,结果是不可预测的。从性能方面看,该方法类同于 for-each 遍历(即方法二)的性能。
Map map = new HashMap();
for (Integer key : map.keySet()) {Integer value = map.get(key);
System.out.println("Key =" + key + ", Value =" + value);
}
作为方法一的替代,这个代码看上去更加干净;但实际上它相当慢且无效率。因为从键取值是耗时的操作(与方法一相比,在不同的 Map 实现中该方法慢了 20%~200%)。如果你安装了 FindBugs,它会做出检查并警告你关于哪些是低效率的遍历。所以尽量避免使用。
如果仅需要键 (keys) 或值 (values) 使用方法二。如果你使用的语言版本低于 java 5,或是打算在遍历时删除 entries,必须使用方法三。否则使用方法一(键值都要)。