"it.next()" + "it.nextIndex()" 的两个版本,但顺序不同,为什么结果不同

Two version of "it.next()" + "it.nextIndex()" but in difference order, why result is different

我正在尝试学习 ListIterator 接口。我想出了两个版本的代码,

List<Integer> list1 = new LinkedList<>(Arrays.asList(11,22,33,44));

ListIterator<Integer> it = list1.listIterator();

while (it.hasNext()){

    //version 1
    System.out.println("value: " + it.next() + " index: " + it.nextIndex());

    //version 2
    System.out.println("index: " + it.nextIndex() + " value: " + it.next());
}

版本 1 的结果:

value: 11 index: 1
value: 22 index: 2
value: 33 index: 3
value: 44 index: 4

版本 2 的结果:

index: 0 value: 11
index: 1 value: 22
index: 2 value: 33
index: 3 value: 44

我原以为结果是一样的,但显然不是。有人可以告诉我为什么吗?

字符串连接表达式从左到右求值。这意味着

"value: " + it.next() + " index: " + it.nextIndex()

nextIndex()next()调用之后调用,在

"index: " + it.nextIndex() + " value: " + it.next()

正好相反。

由于next()移动了迭代器的位置,所以nextIndex()返回的值在两种情况下都是不同的。

当首先调用it.next()时,it.nextIndex()将return元素在it.next()结果之后的索引,因为it.next()将return 当前索引处的值,然后递增索引。

视觉示例:


it.next() 第一:

      v
index 0  1  2  3
value 11 22 33 44

call it.next() -> returns 11, increments index by 1

         v
index 0  1  2  3
value 11 22 33 44

call it.nextIndex() -> returns 1

it.nextIndex() 第一:

      v
index 0  1  2  3
value 11 22 33 44

call it.nextIndex() -> returns 0

      v   
index 0  1  2  3
value 11 22 33 44

call it.nextIndex() -> returns 11, increments index by 1

         v
index 0  1  2  3
value 11 22 33 44