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
相关产品推荐
相关产品推荐

