Java中使用ArrayList的listIterator时,add后调用previous无输出问题
ArrayList的ListIterator先add再previous的问题分析与解决
先看你提供的测试代码:
package listIterator; import java.util.ArrayList; import java.util.ListIterator; public class Test { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(10); list.add(20); list.add(30); // this code will not work ListIterator<Integer> it; System.out.println("using add"); it = list.listIterator(list.size()); while(it.hasPrevious()) { it.add(5); it.previous(); } System.out.println(list); } }
问题原因
这段代码会陷入无限循环,完全达不到在每个元素前插入5的预期效果,核心是没搞懂ListIterator的add()和previous()行为逻辑:
- 用
list.listIterator(list.size())初始化迭代器时,游标停在列表末尾(最后一个元素的后方)。 - 第一次循环调用
it.add(5),会把5插入到游标当前位置(即列表末尾),之后游标自动移到新插入元素的后方。 - 紧接着调用
it.previous(),游标会退回到刚插入的5的位置,此时游标仍在原最后一个元素(30)的后方,下一次循环hasPrevious()依然为true,导致重复执行add操作,无限往列表里插入5。
正确实现
如果需求是在每个元素前面插入5,正确的操作顺序是先调用previous()定位到目标元素,再调用add()插入:
package listIterator; import java.util.ArrayList; import java.util.ListIterator; public class Test { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); list.add(10); list.add(20); list.add(30); System.out.println("using add"); ListIterator<Integer> it = list.listIterator(list.size()); while(it.hasPrevious()) { it.previous(); // 先移动到当前元素的位置 it.add(5); // 在该元素前面插入5 } System.out.println(list); // 输出:[5, 10, 5, 20, 5, 30] } }
逻辑说明
- 每次循环先调用
previous(),将游标从当前位置移到前一个元素的位置,同时返回该元素。 - 调用
add(5)时,会把5插入到游标当前位置的前方(也就是刚定位到的元素的前面),插入后游标自动移到新元素的后方,不会干扰下一次迭代的定位。
内容的提问来源于stack exchange,提问作者user3640657
相关产品推荐
相关产品推荐

