Maison  >  Article  >  Java  >  Explication détaillée de la méthode Remove dans Java AbstractCollection

Explication détaillée de la méthode Remove dans Java AbstractCollection

Y2J
Y2Joriginal
2017-05-09 13:50:132101parcourir

Cet article présente principalement les informations pertinentes sur l'explication détaillée de l'instance ArrayList de suppression d'éléments des collections Java. Les amis qui en ont besoin peuvent se référer à

Explication détaillée des instances ArrayList de suppression d'éléments de. Collections Java

Il existe une méthode Remove dans la classe de collection AbstractCollection Afin de s'adapter à une variété de collections différentes, cette méthode permet de supprimer des éléments vides lors de l'examen de cette partie du code. , j'ai une question, pourquoi est-il supprimé directement en utilisant it.remove() ici ?

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;
  }

Ensuite, prenez ArrayList comme exemple pour expliquer. Sa structure d'héritage est illustrée dans la figure ci-dessous. De plus, ArrayList contient une classe d’implémentation d’Iterator.

Ecrire un code de test :

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);

Le point clé reste la ligne iter.next() == null, la source code de next Comme suit :

 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 représente ici l' index pendant le parcours Lorsque la méthode suivante est appelée, le cusor pointe en fait vers l'élément suivant de l'élément actuel, et lasrRet est utilisé pour obtenir les données à l'index actuel et les renvoie.

Dans la méthode remove(), la suppression se fait via l'index de 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();
      }
    }

A l'aide des exemples de tests mentionnés ci-dessus, chaque étape peut être calculée.

1. Appelez la méthode next(), le curseur pointe vers l'élément 0, i se voit attribuer la valeur du curseur, puis le curseur est modifié en i+1, pointant vers l'élément 1, qui est l'endroit où null est à la position, lastRet se voit attribuer une valeur de 0.
2. Appelez la méthode next(). Le curseur pointe sur l'élément 1 et l'affecte à i. Ensuite, le curseur incrémente i+1 et devient 2. LastRet reçoit la valeur 1.
3. delete et supprime la collection. L'élément représenté par lastRet. Une fois la suppression terminée, modifiez le pointeur du curseur et rendez attenduModCount et modCount cohérents pour éviter les échecs rapides.

[Recommandations associées]

1. Tutoriel vidéo Java gratuit

2. Tutoriel vidéo Java de la Geek Academy

.

3. Manuel du didacticiel JAVA

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn