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

为何Iterator循环中'Mary'消失?Java集合遍历异常排查

为什么Iterator遍历ArrayList时'Mary'看似消失但实际没被删除?

让我来帮你拆解这个问题——你遇到的不是'Mary'被删除了,而是你的Iterator遍历逻辑里重复调用了next()方法,导致直接跳过了'Mary'的输出!

问题根源分析

先看你这段Iterator遍历的核心代码:

while (iterator.hasNext()){
    System.out.println(iterator.next()); // 第一次调用next()
    if (iterator.next().equals("Nick")){ // 第二次调用next()
        iterator.remove();
    }
}

Iterator的next()方法有个关键特性:每次调用都会把内部指针移动到下一个元素,而不是停留在当前元素。我们一步步走一遍执行流程,就能清楚看到问题:

  • 初始状态:Iterator指针位于第一个元素(John)的前面。
  • 第一次进入循环:
    1. 调用iterator.next(),指针移动到John,输出"John"。
    2. 紧接着再次调用iterator.next(),指针直接跳到Mary,判断是否等于"Nick"?显然不成立,所以不执行删除操作。
  • 第二次进入循环:
    1. 调用iterator.next(),指针移动到George,输出"George"。
    2. 再次调用iterator.next(),指针跳到Nick,判断等于"Nick",执行iterator.remove(),把Nick从列表中删除。
  • 第三次检查hasNext():此时指针已经到了列表末尾,循环结束。

你看,整个过程中'Mary'只是被next()方法跳过了,根本没被输出,也没有被删除——这就是为什么后续for循环里还能正常看到'Mary'的原因。

修正后的正确代码

解决这个问题的核心是只调用一次next(),把当前元素存到变量中复用,避免指针意外移动:

public static void main(String[] args) {
    ArrayList<String> names = new ArrayList<String>();
    names.add("John");
    names.add("Mary");
    names.add("George");
    names.add("Nick");
    Iterator<String> iterator = names.iterator();
    System.out.println("Iterator method: ");
    while (iterator.hasNext()){
        String currentName = iterator.next(); // 仅调用一次next(),存储当前元素
        System.out.println(currentName);
        if (currentName.equals("Nick")){
            iterator.remove();
        }
    }
    System.out.println("\nFOR loop method: ");
    for (int i=0; i < names.size(); i++){
        System.out.println(names.get(i));
    }
}

修正后执行的输出会符合预期:

Iterator方式:
John
Mary
George
FOR循环方式:
John
Mary
George

内容的提问来源于stack exchange,提问作者Fotis Zachopoulos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:21:42