Warum wurde iterator.remove () als optionale Operation beschrieben?

8

Ich habe die Dokumentation von% co_de durchgesehen ( Ссылка ) % dort wurde Iterator.remove() ) als

beschrieben %Vor%
  

Entfernt das letzte zurückgegebene Element aus der zugrunde liegenden Sammlung   durch den Iterator (optionale Operation).   Diese Methode kann nur einmal aufgerufen werden   per Anruf zum nächsten. Das Verhalten eines   Iterator ist nicht spezifiziert, wenn der   Die zugrunde liegende Sammlung wird geändert   während die Iteration läuft in   auf irgendeine andere Weise als durch das Anrufen   Methode.

  1. Also kann jemand sagen, was "optional" bedeutet.
  2. Wirkt sich dies auf die Robustheit der Operation aus? (Wie bei C ++ garantiert dies nicht die Robustheit der Operationen.)
  3. Warum "optional" hier kategorisch angegeben wurde.
  4. Was bedeutet "Modifikation" in der zweiten Zeile der Dokumentation
  

Verhalten eines Iterators ist nicht angegeben, wenn die zugrunde liegende Sammlung geändert wird

    
Ashish Agarwal 08.10.2009, 07:57
quelle

3 Antworten

13

# 1: Optional bedeutet, dass Sie es implementieren können oder werfen Sie ein UnsupportedOperationException

# 2: Diese Operation ist optional, weil Sie manchmal nicht möchten, dass der Inhalt Ihres Iterators geändert wird. Oder was verstehst du unter "Robustheit der Bedienung"?

BEARBEITEN # 4: behavior of an iterator is unspecified if the underlying collection is modified

Normalerweise verwenden Sie einen Iterator, indem Sie

ausführen %Vor%

Wenn Sie jetzt ein Element entfernen möchten, während Sie durch die Liste iterieren, rufen Sie

auf %Vor%

Das ist nicht sauber , möglicherweise korrumpiert Daten in Ihrer Liste / Sammlung / ... und sollte vermieden sein. Stattdessen entferne () das Element durch den Iterator :

%Vor%     
Atmocreations 08.10.2009, 08:08
quelle
6

Zunächst ist java.util.Iterator eine Schnittstelle, d. h. eine Vereinbarung, wie Klassen, die diese Schnittstelle implementieren, mit dem Rest der Welt interagieren. Es liegt in ihrer Verantwortung, wie sie die Interaface-Methoden implementieren.

Wenn die zugrunde liegende Datenstruktur das Entfernen nicht erlaubt, wird remove() eine UnsupportedOperationException werfen. Wenn Sie beispielsweise eine Ergebnismenge durchlaufen, die von einer DB abgerufen wurde, ist es sinnvoll, diese Methode nicht zu implementieren.

Wenn Sie über eine Sammlung iterieren, die zwischen gleichzeitigen Threads geteilt wird, und der andere Thread den Daten-Iterations-Thread ändert, werden unbestimmte Ergebnisse zurückgegeben.

    
Boris Pavlović 08.10.2009 08:08
quelle
2

Es wird als optional beschrieben, da nicht alle Auflistungsklassen, die Ihnen einen Iterator geben können, die Methode remove() im Iterator implementieren, den sie zurückgeben. Wenn der zurückgegebene Iterator es nicht implementiert, wird ein UnsupportedOperationException ausgelöst.

Die normalen java.util.ArrayList , java.util.LinkedList und andere Standard-Auflistungsklassen implementieren die remove() -Methode in ihren Iteratoren, sodass Sie sie sicher verwenden können.

    
Jesper 08.10.2009 08:08
quelle

Tags und Links