Der Javadoc für ListIterator sagt:
A
ListIterator
hat kein aktuelles Element; Die Cursorposition liegt immer zwischen dem Element, das bei einem Aufruf von zurückgegeben wird,previous()
und dem Element, das bei einem Aufruf von zurückgegeben wirdnext()
.
Warum wurde Java so ListIterator
implementiert, dass es zwischen Elementen und nicht auf ein aktuelles Element zeigt? Es scheint, dass dies den Client-Code weniger lesbar macht, wenn er wiederholt aufgerufen getNext()
werden getPrevious()
muss. Daher gehe ich davon aus, dass es einen guten Grund für die Wahl geben muss.
Als Randbemerkung, schrieb ich nur eine kleine Bibliothek peekable-Arraylist genannt , die sich ArrayList
, Iterator
und ListIterator
das stellt ein peekAtNext()
und peekAtPrevious()
Verfahren implementiert , wie:
@Override public synchronized T peekAtNext() {
T t = next();
previous();
return t;
}
Antworten:
Soweit ich das beurteilen kann, liegt der Grund in dem Teil von Javadoc, den Sie nicht zitiert haben (Hervorhebung unter meinem):
Sie sehen, der beabsichtigte Zweck besteht darin, die Verwendung zuzulassen, während die Liste geändert wird. Mögliche Änderungen umfassen offenbar das Entfernen der Elemente.
Überlegen Sie nun, was passieren würde, wenn wir ein Element entfernen würden, das
current()
für den Iterator bestimmt ist - vorausgesetzt, der Iterator hätte eine Vorstellung vom aktuellen Element? In diesem Zusammenhang ist die Art und Weise, wie es ohne den Begriff des aktuellen Elements implementiert wird, für mich ziemlich sinnvoll - da sich der Iterator auf diese Weise nicht um das Entfernen von Elementen kümmern muss.Es ist wichtig zu beachten, dass für javadoc keine Schnittstellenimplementierungen erforderlich sind, um threadsicher zu sein.
ListIterator ist in der Lage, Änderungen zu verarbeiten, die beim Iterieren von demselben Thread vorgenommen wurden. Nicht alle Iteratoren sind so, ConcurrentModificationException-Javadocs warnen ausdrücklich davor:
quelle
insertBefore
und benötigeninsertAfter
, obwohl dies kein so großes Problem ist wie einremove
.next()
?remove()
wäresynchronized
wie wäregetCurrent()
. Vermisse ich etwasArrayList
, um dies zu erreichen.