引言
HashMap相信所有学Java的都一定不会感到陌生,作为一个非常重用且非常实用的Java提供的容器,它在我们的代码里面随处可见。因此遍历操作也是我们经常会使用到的。HashMap的遍历方式现如今有非常多种:
-
使用迭代器(Iterator)。
-
使用
keySet()
获取键的集合,然后通过增强的 for 循环遍历键。 -
使用
entrySet()
获取键值对的集合,然后通过增强的 for 循环遍历键值对。 -
使用 Java 8+ 的 Lambda 表达式和流。
以上遍历方式的孰优孰劣,在《阿里巴巴开发手册》中写道:
这里推荐使用的是entrySet
进行遍历,在Java8中推荐使用Map.forEach()
。给出的理由是遍历次数上的不同。
-
keySet遍历,需要经过两次遍历。
-
entrySet遍历,只需要一次遍历。
其中keySet遍历了两次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。
其中后面一段话很好理解,但是前面这句话却有点绕,为什么转换成了Iterator遍历了一次?
我查阅了各个平台对HashMap的遍历,其中都没有或者原封不动的照搬上句话。(当然也可能是我没有查阅到靠谱的文章,欢迎指正)
keySet如何遍历了两次
我们首先写一段代码,使用keySet遍历Map。
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");
for (String key : map.keySet()) {
String value = map.get(key);
System.out.println(key + ":" + value);
}
}
}
运行结果显而易见的是
k1:v1
k2:v2
k3:v3
两次遍历,第一次遍历所描述的是转为Iterator对象我们好像没有从代码中看见,我们看到的后面所描述的遍历,也