以下带有listiterator的代码无限运行

时间:2019-01-17 02:53:22

标签: 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();
    while(li.hasNext()) {
     li.next();
    }
    while(li.hasPrevious()) {
     Integer i = (Integer)li.previous();
     li.add(56);
    }
    System.out.println(l);
}

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

2 个答案:

答案 0 :(得分:1)

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

您可以通过以下方式实现自己想要的:-

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

输出

[56, 0, 56, 1, 56, 2, 56, 3, 56, 4]

答案 1 :(得分:0)

如果您阅读文档,即https://channel9.msdn.com/Shows/Visual-Studio-Toolbox/Angular-and-NET-Core的Javadoc,则会看到:

  

将指定的元素插入列表(可选操作)。将该元素立即插入将由next()返回的元素之前(如果有的话),并将其插入将由previous()返回的元素之后(如果有的话)。 (如果列表不包含任何元素,则新元素将成为列表上的唯一元素。)新元素将插入到隐式光标之前:对next的后续调用将不受影响,而后续的调用到previous将会返回新元素。 (此调用将调用nextIndexpreviousIndex返回的值增加一个。)

因此,交替调用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", "^");
}

输出

   10   20   30   40
                     ^
previous(): 40
   10   20   30   40
                ^
add(i)
   10   20   30   39   40
                     ^
previous(): 39
   10   20   30   39   40
                ^
add(i)
   10   20   30   38   39   40
                     ^
previous(): 38
   10   20   30   38   39   40
                ^
add(i)
   10   20   30   37   38   39   40
                     ^
previous(): 37
   10   20   30   37   38   39   40
                ^
add(i)
   10   20   30   36   37   38   39   40
                     ^
previous(): 36
   10   20   30   36   37   38   39   40
                ^
add(i)
   10   20   30   35   36   37   38   39   40
                     ^
previous(): 35
   10   20   30   35   36   37   38   39   40
                ^
add(i)
   10   20   30   34   35   36   37   38   39   40
                     ^
previous(): 34
   10   20   30   34   35   36   37   38   39   40
                ^
add(i)
   10   20   30   33   34   35   36   37   38   39   40
                     ^
previous(): 33
   10   20   30   33   34   35   36   37   38   39   40
                ^
add(i)
   10   20   30   32   33   34   35   36   37   38   39   40
                     ^
previous(): 32
   10   20   30   32   33   34   35   36   37   38   39   40
                ^
add(i)
   10   20   30   31   32   33   34   35   36   37   38   39   40
                     ^
previous(): 31
   10   20   30   31   32   33   34   35   36   37   38   39   40
                ^