遍历List并移除其中的某些元素,看起来似乎很简单,但是也容易犯错。
package com.cnrvoice.account.constant;
import java.util.ArrayList;
import java.util.List;
public class RemoveElementFromListWhenIterator
{
public static void main(String[] args)
{
List<User> list = new ArrayList<User>();
User user1 = new User(100, "a", 10);
User user2 = new User(101, "b", 11);
User user3 = new User(102, "c", 12);
User user4 = new User(103, "d", 12);
User user5 = new User(104, "e", 14);
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
//foreach(list);
loop(list);
}
public static void foreach(List<User> list){
for (User user : list)
{
if(user.getAge() == 12){
System.out.println("remove "+user.getName());
list.remove(user);
}
}
for (User user : list)
{
System.out.println(user.getId());
}
}
public static void loop(List<User> list){
for (int i=0;i<list.size();)
{
if(list.get(i).getAge() == 12){
System.out.println("remove "+list.get(i).getName());
//移除之后,后面的元素前移,i不加
list.remove(i);
}else{
i++;
}
}
for (User user : list)
{
System.out.println(user.getId());
}
}
}
foreach()方法,
remove c
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at com.cnrvoice.account.constant.RemoveElementFromListWhenIterator.foreach(RemoveElementFromListWhenIterator.java:26)
at com.cnrvoice.account.constant.RemoveElementFromListWhenIterator.main(RemoveElementFromListWhenIterator.java:21)
loop()方法,
remove c
remove d
100
101
104