You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()方法是**有“副作用”**的——每次调用它,迭代器都会向前移动一位,返回当前指向的元素。

你这里的操作逻辑是:

  1. 第一次调用itr.next(),拿到第一个key(比如"One"),迭代器直接走到第二个元素的位置
  2. 第二次调用itr.next(),拿到第二个key(比如"Two"),迭代器又走到第三个元素,然后用这个key去取值
  3. 一次循环直接跳过了两个元素,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:12:10