一、首先说正确的方式
1、让索引同步调整
for (int i = 0; i < list.size(); i++) {
Apple apple = list.get(i);
if(apple.getWeight()==23){
list.remove(i--);
}
}
2、倒序遍历List删除元素
for (int i = list.size() - 1; i >= 0; i--) {
Apple apple = list.get(i);
if (apple.getWeight() == 23) {
list.remove(i);
}
}
3、Iterator.remove() 方法会在删除当前迭代对象的同时,会保留原来元素的索引,建议使用此方式。
Iterator<Apple> iterator = list.iterator();
while (iterator.hasNext()) {
Apple apple = iterator.next();
if (apple.getWeight() == 23) {
iterator.remove();
}
}
二、错误的删除方式
1、正序遍历
for (int i = 0; i < list.size(); i++) {
Apple apple = list.get(i);
if(apple.getWeight()==23){
list.remove(i);
}
}
2、迭代遍历,用list.remove(i)方法删除元素,抛出异常:java.util.ConcurrentModificationException
Iterator<Apple> iterator = list.iterator();
while (iterator.hasNext()) {
Apple apple = iterator.next();
if (apple.getWeight() == 23) {
list.remove(apple);
}
}
3、forech删除,抛出异常:java.util.ConcurrentModificationException
for (Apple apple : list) {
if (apple.getWeight() == 23) {
list.remove(apple);
}
}