ホームページ  >  記事  >  Java  >  Java AbstractCollectionのremoveメソッドの詳細説明

Java AbstractCollectionのremoveメソッドの詳細説明

Y2J
Y2Jオリジナル
2017-05-09 13:50:132036ブラウズ

この記事では、Java コレクション要素の ArrayList インスタンスの詳細な説明に関する関連情報を主に紹介します。必要な方は参照してください。

Java コレクション要素の ArrayList インスタンスの詳細な説明があります。このメソッドは、AbstractCollection コレクション クラスの削除メソッドです。このメソッドは、さまざまなコレクションを備えており、空の要素を削除できるのに適しています。コードのこの部分を見て、なぜ直接削除するのかという疑問が生じました。ここで it.remove() を使用しますか?

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

次に、ArrayList を例にして説明します。その

継承

構造を下の図に示します。さらに、ArrayList の内部には Iterator の実装クラスがあります。


テストコードを書きます:

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

重要な点はやはり iter.next() == null の行です。 next のソースコードは次のとおりです:

 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 ここで

index

を表します。 next メソッドが呼び出されると、カーソルは実際には現在の要素の次の要素を指し、lasrRet を使用して現在のインデックスのデータを取得して返します。

remove() メソッドでは、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();
      }
    }

上記のテスト例を利用して、各ステップを計算できます。

1. next() メソッドを呼び出し、カーソルが要素 0 を指し、i にカーソルの値が割り当てられ、次にカーソルが i+1 に変更され、null が存在する要素 1 を指し、lastRet が割り当てられます。は0です。
2. next() メソッドを呼び出します。カーソルは要素 1 を指し、それを i に割り当てます。次に、カーソルは i+1 から 2 まで増加し、lastRet には値 1 が割り当てられます。

3. 削除を実行して、コレクション内の lastRet によって表される要素。削除が完了したら、カーソル ポインターを変更し、expectedModCount と modCount を一致させて、高速失敗を回避します。


【関連おすすめ】

1.

Java無料ビデオチュートリアル

3. JAVAチュートリアルマニュアル

以上がJava AbstractCollectionのremoveメソッドの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。