HashMap迭代疑问:为何用itr.next()取值仅返回3个结果?
哈哈,这坑我刚学Java集合迭代的时候也踩过!咱们来一步步拆解问题到底出在哪:
核心问题:两次调用itr.next()消耗了两个元素
先看你循环里的这段代码:
while(itr.hasNext()) { String key = itr.next(); System.out.println("Key: " + key + " Values:" + hm2.get(itr.next())); }
Iterator的next()方法是**有“副作用”**的——每次调用它,迭代器都会向前移动一位,返回当前指向的元素。
你这里的操作逻辑是:
- 第一次调用
itr.next(),拿到第一个key(比如"One"),迭代器直接走到第二个元素的位置 - 第二次调用
itr.next(),拿到第二个key(比如"Two"),迭代器又走到第三个元素,然后用这个key去取值 - 一次循环直接跳过了两个元素,6个元素自然就只跑3次循环,输出3组结果
而当你用hm2.get(key)时,只调用了一次itr.next()获取当前元素,每次循环处理一个键值对,所以能输出全部6个值。
修正后的代码
把循环里的hm2.get(itr.next())改成hm2.get(key)就解决问题了,顺便还得修正你代码里变量名不一致的小bug(声明了hm1却一直用hm2):
HashMap<String, Integer> hm2 = new HashMap<String, Integer>(); hm2.put("One", 1); hm2.put("Two", 2); hm2.put("Three", 3); hm2.put("Four", 4); hm2.put("Five", 5); hm2.put("Six", 6); Set<String> keySet = hm2.keySet(); Iterator<String> itr = keySet.iterator(); while(itr.hasNext()) { String key = itr.next(); System.out.println("Key: " + key + " Values:" + hm2.get(key)); }
额外小技巧:更简洁的迭代方式
其实Java里迭代HashMap有更省心的写法,直接用增强for循环遍历entrySet(),不用手动处理迭代器,还能直接拿到键值对:
for (Map.Entry<String, Integer> entry : hm2.entrySet()) { System.out.println("Key: " + entry.getKey() + " Values:" + entry.getValue()); }
这种写法既简洁,又不容易犯“多次调用next()”的错误,推荐日常使用~
内容的提问来源于stack exchange,提问作者Shagun Mittal
相关产品推荐
相关产品推荐

