Heim >Java >javaLernprogramm >Warum verursacht das Ändern einer ArrayList während einer For-Each-Schleife eine ConcurrentModificationException?

Warum verursacht das Ändern einer ArrayList während einer For-Each-Schleife eine ConcurrentModificationException?

Barbara Streisand
Barbara StreisandOriginal
2024-12-13 08:06:11924Durchsuche

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

ConcurrentModificationException für ArrayList

Betrachten Sie den folgenden Code:

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

Bei Ausführung löst dieser Code eine ConcurrentModificationException aus. Diese Ausnahme tritt auf, weil das Ändern der ArrayList während der Iteration mit einer for-each-Schleife unsicher ist.

Um dieses Problem zu beheben, ersetzen Sie die for-each-Schleife durch eine Iteratorschleife:

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

An iterator bietet eine sichere Möglichkeit, Elemente aus einer ArrayList zu entfernen, während darüber iteriert wird. Es verwaltet einen Cursor, der die aktuelle Position in der Liste verfolgt und sicherstellt, dass das Entfernen eines Elements keine Auswirkungen auf den Iterationsprozess hat.

Das obige ist der detaillierte Inhalt vonWarum verursacht das Ändern einer ArrayList während einer For-Each-Schleife eine ConcurrentModificationException?. 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