2012-06-25 20 views
13

In Iterator Sun hinzugefügt die remove-Methode, um das zuletzt zugegriffen Element der Auflistung zu entfernen. Warum gibt es keine add-Methode, um der Sammlung ein neues Element hinzuzufügen? Welche Art von Nebenwirkungen kann es auf die Sammlung oder den Iterator haben?Warum gibt es keine Add-Methode in Iterator-Schnittstelle

+0

Ich glaube, Sie haben eine Duplizierung: http://stackoverflow.com/questions/993025/java-adding-elements-to-a-collection-during-iteration – mihaisimi

+0

@mihaisimi - nein, das ist wirklich eine andere Frage. –

+0

Ja, Sie haben Recht. Dennoch lieferte coolbird eine gute Antwort auf diesen Thread. – mihaisimi

Antwort

10

Der einzige Zweck eines Iterators besteht darin, durch eine Sammlung aufzuzählen. Alle Sammlungen enthalten die add() Methode, um Ihren Zweck zu erfüllen. Es würde keinen Sinn machen, einen Iterator hinzuzufügen, weil die Sammlung möglicherweise bestellt wird oder nicht (im Fall von HashSet).

EDIT: Während auf einem anderen Problem arbeiten, kam ich mit einem anderen Grund auf, dass Iterator ein add() Verfahren fehlt. Unter der Haube von ArrayList (Zeile 111) und HashMap (Zeile 149) sehen wir, dass die Implementierung nur ein paar Methoden ist, die ein Array von Objekten umgeben. Jetzt betrachten wir, wie Arrays im Speicher behandelt werden.

zero-based array indexes

Dies ist ein Array von 5 Elementen. Es gibt jedoch sechs Indizes. Der Buchstabe "a" in diesem Array wird als Element 0 aufgelistet, denn um es von links nach rechts wie ein Computer zu lesen, müssen Sie bei Index 0 beginnen. Nun, wenn wir durch dieses Array iterieren (ja, Sammlung, aber es läuft auf ein Array hinaus), wir werden bei Index 0 beginnen und mit Index 1 fortfahren. An dieser Stelle im Iterator möchten wir add("f"); aufrufen. Vergleichen wir an dieser Stelle die Implikationen von add() und remove(). remove() würde ein Leerzeichen im Array lassen, das einfach zu überspringen ist, weil wir sofort erkennen können, dass es kein Mitglied ist. Auf der anderen Seite, add() würde ein neues Element, in dem war vorher nicht. Dies wirkt sich auf die Länge des Arrays aus, das wir durchlaufen. Was passiert, wenn wir zu diesem letzten Element kommen? Können wir sogar garantieren, dass es da ist (das heißt, das Array hat the maximum size nicht überschritten)?

Alles in allem haben die Argumente auf die eine oder andere Weise gültige Punkte, aber die Quintessenz ist, dass das Verhalten einer add() Methode nicht in allen Fällen gut definiert ist. Sun musste sich entscheiden, wo sie die Funktionalität einschränken sollte, und sie entschieden sich dafür, diese Methode nicht einzuschließen.

+0

"weil die Sammlung möglicherweise bestellt wird oder nicht" - bitte erläutern Sie es ein wenig. Danke – droidsites

+0

Ich habe deine Aussage :-). Danke – droidsites

+0

Ein HashSet gibt keine Garantie für die Reihenfolge seiner Mitglieder. Wenn Sie versuchen, einen Punkt zu finden, an dem Sie einen Wert einfügen möchten, haben Sie gerade den Punkt eines Iterators überwunden. – gobernador

0

Ich kann mir keinen theoretischen Grund vorstellen, warum add() nicht in Iterator enthalten sein könnte. Genau wie die Iterator es erlauben kann, dass Elemente aus der Sammlung durch sich selbst entfernt werden, könnte sie so entworfen werden, dass sie Elemente behandelt, die auf die gleiche Weise hinzugefügt werden.

Aber ich werde das in all meinen Jahren der Programmierung in Java sagen - über 15! - Ich wollte nie eine Iterator.add() Methode. Also ich vermute, dass es einfach nicht so nützlich ist.

5

Wenn Sie an einer Liste arbeiten, können Sie ListIterator verwenden, die sowohl Hinzufügen als auch Entfernen bietet.

+3

Beantwortet die Frage eigentlich nicht. Aber ja, 'Iterator' implementiert' add' nicht, weil es nicht 'ListIterator' ist. – Robert

10

Okay, hier gehen wir:

Die Antwort ist eindeutig in der Gestaltung FAQ erklärt:

Warum Sie eine Iterator.add Methode nicht zur Verfügung stellen?

Die Semantik ist unklar, da der Vertrag für Iterator keine Garantie für die Reihenfolge der Iteration gibt. Beachten Sie jedoch, dass ListIterator eine Add-Operation anbietet, da sie die Reihenfolge der Iteration garantiert.

http://docs.oracle.com/javase/1.4.2/docs/guide/collections/designfaq.html#10

0

Iterator hat einen Zeiger auf das nächste Element nur. wo als ListIterator auch Zeiger auf das vorherige Element haben (denken Sie daran, es kann rückwärts gehen).

Verwandte Themen