在用ListIterator previous時遇到一個問題,參見下面範例程式碼:
ListIterator< HistoryItem> iterators = curStack.listIterator();
while ( iterators.hasNext() ) {
HistoryItem item = iterators.next();
if ( item.getActivity() == activity ) {
item = iterators.previous();
......
break;
}
}
在調用ListIterator::next後,希望調用previous返回上一個item,但是不正確,返回的還是當前的item.
分析下源碼是這樣的:
public E previous() {
if (expectedModCount == modCount) {
try {
E result = get(pos); // pos是當前位置,返回當前item,並且pos-1
lastPosition = pos;
pos--;
return result;
} catch (IndexOutOfBoundsException e) {
throw new NoSuchElementException();
}
}
throw new ConcurrentModificationException();
}
public E next() {
if (expectedModCount == modCount) {
try {
E result = get(pos + 1); // 返回當前下一個item,並且pos+1
lastPosition = ++pos;
return result;
} catch (IndexOutOfBoundsException e) {
throw new NoSuchElementException();
}
}
throw new ConcurrentModificationException();
}
由此可見,previous只是把索引指向前一個item,返回的仍然是當前的item;而next是真的返回下一個item。