ホームページ >Java >&#&チュートリアル >For-Each ループ中に ArrayList を変更すると ConcurrentModificationException が発生するのはなぜですか?

For-Each ループ中に ArrayList を変更すると ConcurrentModificationException が発生するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-13 08:06:11920ブラウズ

Why Does Modifying an ArrayList During a For-Each Loop Cause a ConcurrentModificationException?

ConcurrentModificationException for ArrayList

次のコードを考えてみましょう:

private String toString(List<DrugStrength> aDrugStrengthList) {
    StringBuilder str = new StringBuilder();
        for (DrugStrength aDrugStrength : aDrugStrengthList) {
            if (!aDrugStrength.isValidDrugDescription()) {
                aDrugStrengthList.remove(aDrugStrength);
            }
        }
        str.append(aDrugStrengthList);
        if (str.indexOf("]") != -1) {
            str.insert(str.lastIndexOf("]"), "\n          " );
        }
    return str.toString();
}

このコードを実行すると、ConcurrentModificationException がトリガーされます。この例外は、for each ループを使用して ArrayList を反復処理する際に ArrayList を変更することが安全でないために発生します。

この問題を解決するには、for each ループを反復子ループに置き換えます。

for (Iterator<DrugStrength> it = aDrugStrengthList.iterator(); it.hasNext(); ) {
    DrugStrength aDrugStrength = it.next();
    if (!aDrugStrength.isValidDrugDescription()) {
        it.remove();
    }
}

An iterator は、ArrayList を反復処理する際に ArrayList から要素を削除する安全な方法を提供します。リスト内の現在位置を追跡するカーソルを維持し、要素の削除が反復プロセスに影響を与えないようにします。

以上がFor-Each ループ中に ArrayList を変更すると ConcurrentModificationException が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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