まず、正しい方法について最初に話します
1.インデックスを同期的に調整します
for (int i = 0; i < list.size(); i++) {
Apple apple = list.get(i);
if(apple.getWeight()==23){
list.remove(i--);
}
}
2.リストを逆の順序でトラバースして、要素を削除します
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);
}
}