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中文网其他相关文章!