Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der Remove-Methode in Java AbstractCollection

Detaillierte Erläuterung der Remove-Methode in Java AbstractCollection

Y2J
Y2JOriginal
2017-05-09 13:50:132101Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zur detaillierten Erklärung der ArrayList-Instanz zum Löschen von Elementen aus Java-Sammlungen vorgestellt. Freunde, die sie benötigen, können sich auf

Ausführliche Erklärung der ArrayList-Instanzen zum Löschen von Elementen beziehen Java-Sammlungen

Es gibt eine Remove-Methode in der AbstractCollection-Sammlungsklasse. Um sich an eine Vielzahl unterschiedlicher Sammlungen anzupassen, ermöglicht diese Methode das Löschen leerer Elemente Ich habe eine Frage: Warum wird es hier direkt mit it.remove() gelöscht?

public boolean remove(Object o) {
    Iterator<E> it = iterator();
    if (o==null) {
      while (it.hasNext()) {
        if (it.next()==null) {
          it.remove();
          return true;
        }
      }
    } else {
      while (it.hasNext()) {
        if (o.equals(it.next())) {
          it.remove();
          return true;
        }
      }
    }
    return false;
  }

Nehmen Sie als Nächstes ArrayList als Beispiel zur Erläuterung. Seine Vererbungsstruktur ist in der folgenden Abbildung dargestellt. Darüber hinaus enthält ArrayList eine Implementierungsklasse von Iterator.

Schreiben Sie einen Testcode:

AbstractCollection<String> list = new ArrayList<>();
    list.add("a");
    list.add(null);
    list.add(null);

    Iterator<String> iter = list.iterator();
    while(iter.hasNext()) {
      if(iter.next() == null) {
        iter.remove();
      }
    }
    System.out.println(list);

Der entscheidende Punkt ist immer noch die Zeile iter.next() == null, die Quelle Code von next Wie folgt:

 public E next() {
      checkForComodification();
      int i = cursor;
      if (i >= size)
        throw new NoSuchElementException();
      Object[] elementData = ArrayList.this.elementData;
      if (i >= elementData.length)
        throw new ConcurrentModificationException();
      cursor = i + 1;
      return (E) elementData[lastRet = i];
    }

cusor stellt hier den Index während des Durchlaufs dar. Wenn die nächste Methode aufgerufen wird, zeigt der cusor tatsächlich auf das nächste Element des aktuellen Elements und lasrRet wird verwendet, um die Daten am aktuellen Index abzurufen und zurückzugeben.

In der Methode „remove()“ erfolgt das Löschen über den Index von lastRet.

  public void remove() {
      if (lastRet < 0)
        throw new IllegalStateException();
      checkForComodification();

      try {
        ArrayList.this.remove(lastRet);
        cursor = lastRet;
        lastRet = -1;
        expectedModCount = modCount;
      } catch (IndexOutOfBoundsException ex) {
        throw new ConcurrentModificationException();
      }
    }

Anhand der oben genannten Testbeispiele kann jeder Schritt berechnet werden.

1. Rufen Sie die next()-Methode auf, der Cursor zeigt auf Element 0, i wird der Wert von Cursor zugewiesen und dann wird der Cursor auf i+1 geändert und zeigt auf Element 1, wo null ist. An der Position wird lastRet der Wert 0 zugewiesen.
2. Rufen Sie die next()-Methode auf und weisen Sie sie i+1 zu. LastRet erhält den Wert 1.
3 Löschen und löschen Sie das durch lastRet dargestellte Element. Ändern Sie nach Abschluss des Löschvorgangs den Cursorzeiger und machen Sie ExpectedModCount und ModCount konsistent, um einen Fastfail zu vermeiden.

【Verwandte Empfehlungen】

1. Kostenloses Java-Video-Tutorial

2. Geek Academy Java-Video-Tutorial

3. JAVA-Tutorial-Handbuch

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Remove-Methode in Java AbstractCollection. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn