Java 以下带有listiterator的代码正在无限期运行

Java 以下带有listiterator的代码正在无限期运行,java,collections,listiterator,Java,Collections,Listiterator,我正在尝试使用listiterator和前面的方法遍历列表。在循环中,如果我尝试使用listiterator.add方法添加元素,则循环将无限迭代 我试图调试代码,但找不到确切的原因 public static methodOne() { List l = new ArrayList(); for(int i = 0; i < 5; i++) { l.add(i); } ListIterator li = l.listIterator();

我正在尝试使用listiterator和前面的方法遍历列表。在循环中,如果我尝试使用listiterator.add方法添加元素,则循环将无限迭代

我试图调试代码,但找不到确切的原因

public static methodOne() {
    List l = new ArrayList();
    for(int i = 0; i < 5; i++) {
     l.add(i);
    }
    ListIterator li = l.listIterator();
    while(li.hasNext()) {
     li.next();
    }
    while(li.hasPrevious()) {
     Integer i = (Integer)li.previous();
     li.add(56);
    }
    System.out.println(l);
}
publicstaticmethodone(){
列表l=新的ArrayList();
对于(int i=0;i<5;i++){
l、 加(i);
}
ListIterator li=l.ListIterator();
while(li.hasNext()){
李。下一步();
}
while(li.hasPrevious()){
整数i=(整数)li.previous();
加(56);
}
系统输出打印LN(l);
}

我希望输出为56,0,1,56,2,56,3,56,4,56,5

您的最后一个循环无限运行,因为您不断添加元素并检查它是否有以前的循环。当然它有之前的,你刚才添加的那个

您可以通过以下方式实现您的目标:-

List<Integer> list = IntStream.range(0, 5)
        .flatMap(i -> IntStream.of(56, i))
        .boxed()
        .collect(Collectors.toList());
System.out.println(list);

如果您阅读文档,即您的javadoc将看到:

将指定的元素插入列表(可选操作)。如果有,则在将由
next()
返回的元素之前插入元素,如果有,则在将由
previous()
返回的元素之后插入元素。(如果列表不包含任何元素,新元素将成为列表上的唯一元素。)新元素插入隐式光标之前:对
next
的后续调用将不受影响,
previous
的后续调用将返回新元素。(此调用将调用
nextIndex
previousIndex
返回的值增加一倍)

因此,交替调用
previous()
add()
将使插入值保持在列表中的相同位置,因此永远不会结束(直到内存耗尽)

要显示发生的情况,请尝试以下代码:

public static void main(String[] args) {
    List<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40));
    ListIterator<Integer> listIter = list.listIterator(list.size());
    print(list, listIter); // Iterator is at end (after 40)

    System.out.println("previous(): " + listIter.previous()); // prints: 40
    print(list, listIter); // Iterator is between 30 and 40

    for (int i = 39; i >= 31; i--) {
        listIter.add(i);   System.out.printf("add(i)%n", i);
        print(list, listIter);

        System.out.println("previous(): " + listIter.previous());
        print(list, listIter);
    }
}
static void print(List<Integer> list, ListIterator<Integer> listIter) {
    for (Integer i : list)
        System.out.printf("%5d", i);
    System.out.printf("%n%" + (listIter.nextIndex() * 5 + 2) + "s%n", "^");
}
public static void main(String[] args) {
    List<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40));
    ListIterator<Integer> listIter = list.listIterator(list.size());
    print(list, listIter); // Iterator is at end (after 40)

    System.out.println("previous(): " + listIter.previous()); // prints: 40
    print(list, listIter); // Iterator is between 30 and 40

    for (int i = 39; i >= 31; i--) {
        listIter.add(i);   System.out.printf("add(i)%n", i);
        print(list, listIter);

        System.out.println("previous(): " + listIter.previous());
        print(list, listIter);
    }
}
static void print(List<Integer> list, ListIterator<Integer> listIter) {
    for (Integer i : list)
        System.out.printf("%5d", i);
    System.out.printf("%n%" + (listIter.nextIndex() * 5 + 2) + "s%n", "^");
}