首页 >Java >java教程 >为什么在 For-Each 循环期间修改 ArrayList 会导致 ConcurrentModificationException?

为什么在 For-Each 循环期间修改 ArrayList 会导致 ConcurrentModificationException?

Barbara Streisand
Barbara Streisand原创
2024-12-13 08:06:11924浏览

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

ArrayList 的 ConcurrentModificationException

考虑以下代码:

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。出现此异常的原因是,在使用 foreach 循环迭代 ArrayList 时修改 ArrayList 是不安全的。

要解决此问题,请将 foreach 循环替换为迭代器循环:

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

An迭代器提供了一种在迭代 ArrayList 时从 ArrayList 中删除元素的安全方法。它维护一个跟踪列表中当前位置的游标,确保删除元素不会影响迭代过程。

以上是为什么在 For-Each 循环期间修改 ArrayList 会导致 ConcurrentModificationException?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn