最近看到一个ListIterator迭代器的例子:
List<Integer> lists=Arrays.asList(1,2,3,4,5,6,7,8,9,0);
ListIterator<Integer> lit=lists.listIterator();
while(lit.hasNext()){
System.out.println(lit.next()+","+lit.previousIndex()+","+lit.nextIndex());
}
觉得打印的应该是“1,0,2”等,结果打印是“1,0,1”。这就有点疑惑了,就去查了下源码。
next()的逻辑大致就是返回当前游标指向的元素,再向前移动:
int i = cursor;
if (i >= elementCount)
throw new NoSuchElementException();
cursor = i + 1;
return elementData(lastRet = i);
下面看 previousIndex(),很简单就是返回游标前一个元素的下标:
public int previousIndex() {
return cursor - 1;
}
问题就在nextIndex()了…,不是我想的游标+1,而是直接返回游标的下标:
public int nextIndex() {
return cursor;
}
结合next()想想,设计者应该希望我们这么使用吧:
lit.previousIndex();
lit.next();
lit.nextIndex();