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

ListIterator调用add()后新添加元素未被迭代的问题咨询

解决ListIterator遍历中添加元素无法被迭代的问题

嘿,这个问题我之前也踩过坑!先把你没写完的代码补全,还原下具体场景:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Example {
    public static void main(String[] s) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(5);
        list.add(6);
        
        ListIterator<Integer> listIterator = list.listIterator();
        while (listIterator.hasNext()) {
            Integer num = listIterator.next();
            if (num == 2) {
                // 满足条件时添加元素
                listIterator.add(3);
                listIterator.add(4);
            }
            System.out.println(num);
        }
        System.out.println("最终列表: " + list);
    }
}

运行这段代码你会发现,控制台只输出了1、2、5、6,但最终列表明明是[1,2,3,4,5,6]——刚加的3和4完全没被迭代到,这是为啥?

问题根源

ListIterator的迭代逻辑不是基于快照,但关键在于:当你调用add()方法时,新元素会被插入到当前迭代器指针的前面,而迭代器指针会自动移动到新元素的后面。举个例子:

  • 迭代器初始在列表开头,next()拿到2后,指针停在2的后面(也就是5的前面)
  • 调用add(3)和add(4),这两个元素会被插在2和5之间,此时迭代器指针在4的后面(还是5的前面)
  • 下一次next()直接拿到5,自然就跳过了3和4

解决方案:调整迭代器位置

如果想遍历到刚添加的元素,只需要在添加后把迭代器指针回退到新元素的前面,这样后续的next()就能依次拿到它们。修改后的代码如下:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Example {
    public static void main(String[] s) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(5);
        list.add(6);
        
        ListIterator<Integer> listIterator = list.listIterator();
        while (listIterator.hasNext()) {
            Integer num = listIterator.next();
            if (num == 2) {
                listIterator.add(3);
                listIterator.add(4);
                // 回退两次:第一次从4后面回到4,第二次回到3前面
                listIterator.previous();
                listIterator.previous();
            }
            System.out.println(num);
        }
        System.out.println("最终列表: " + list);
    }
}

这次运行就能输出1、2、3、4、5、6,所有元素都被迭代到了!

额外注意事项

  • 千万别用普通的Iterator来做这件事,它不支持add()操作,强行修改会抛出异常
  • 如果是多线程环境下操作列表,一定要加锁,ListIterator本身不是线程安全的

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:41:55