注意!ArrayListに追加および削除はと混乱しないでください...

多くの場合、あなたはコレクションにプログラミングプロセスを使用する必要がある、と私たちはしばしば使用されるArrayListのが、削除の最近の増加で、次のレコードを共有するいくつかの問題、がありました。

次のコード・ポイントの二つ

List<String> arrayList1 = new ArrayList<String>();
arrayList1.add("1");
arrayList1.add("2");
for (String s : arrayList1) {
    if("1".equals(s)){
        arrayList1.remove(s);
    }}
    List<String> arrayList2 = new ArrayList<String>();
    arrayList2.add("2");arrayList2.add("1");
    for (String s : arrayList2) {
        if("1".equals(s)){
        arrayList2.remove(s);
    }
}

次のようにプログラムの結果は以下のとおりです。

removeメソッドが成功したarrayList1、
操作arrayList2のremoveメソッドはConcurrentModificationExceptionが例外をスローします。

私たちは、例外の理由を分析するためにソースコードを表示
本質はイテレータイテレータのforeachを使用することであるため、すべてのCollecationコレクションクラスは、反復処理可能なインタフェースを実装します。
イテレータArrayListクラス()メソッドを探します

public Iterator<E> iterator() {
    return new Itr();
}

本質イテレータがのhasNext()メソッドは次のメモリ素子が存在しないと判断し、要素を除去するために、次の()メソッドを使用して最初の呼び出しであります

public boolean hasNext() {
    return cursor != size;
}

@SuppressWarnings("unchecked")
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\];
}

上記arraylist1はなぜ成功し、それを削除することができますか?実際には、それだけのサイクルなので、成功しています。

それの後にエレメント1が削除ので、サイズ1、次いで1のITRカーソル0内部変数、この時= 1、サイクルの終わり、そう成功となります。

なぜarraylist2削除の失敗?それは第二の時間サイクルですが、また、成功を削除しますが、第三裁判官次回のカーソルは、現在のサイズ1で2つの結果の値と等しくないので、次の実行方法ので、最も重要なのは、削除の前に来ましたItrはexpectedModCountクラスは変更されないまま1 modCountを加算した値でArrayListの演算結果は、その後、それは例外がスローされます。

final void checkForComodification() {
    if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
}

modCount増分につながるため、追加操作に、同様に利用できる、ArrayListの中に要素を追加、変更、foreachの中に削除することはできません。

この点で、我々は、イテレータイテレータ削除要素を使用することをお勧めします。

Iterator<String> ite = arrayList2.iterator();
while(ite.hasNext()) {
    if("1".equals(ite.next())) {
        ite.remove();
    }
}

同時操作があれば、また、我々は、イテレータ操作をロックする必要があります。

著者:小さなプログラマを苦労
https://www.toutiao.com/i6754322606561690116/

私は続きを読むには私のブログにお勧めします:

1. JavaのチュートリアルのJVM、コレクション、マルチスレッド、新シリーズ

2. Spring MVCの、ブーツ春、クラウドチュートリアルの春シリーズ

3. Mavenの、Gitは、Eclipseの、IDEAのIntelliJツールチュートリアルシリーズ

4. Javaの、バックエンドアーキテクチャは、アリババと他のメーカーは、新たな疑問に直面します

人生は美しいです、〜明日見ます

おすすめ

転載: www.cnblogs.com/javastack/p/12515934.html