如何正确的删除集合中的元素?
foreach仅仅适合遍历集合元素,不要在foreach循环里对集合元素使用add和remove操作。
实例:
删除list中能被3整除的元素。
List<Integer> list = new ArrayList<Integer>();
for(int i=1;i<=10;i++){
list.add(i);
}
for(Integer item : list){
if(item%3==0){
list.remove(item);
}
}
System.out.println(list);
运行后抛出以下异常:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1043)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:997)
at com.oracle.demo.RemoveItemDemo.main(RemoveItemDemo.java:15)
foreach方式遍历元素的时候,是生成iterator,然后使用iterator遍历。在生成iterator的时候,会保存一个expectedModCount参数,这个是生成iterator的时候List中修改元素的次数。如果你在遍历过程中删除元素,List中modCount就会变化,如果这个modCount和exceptedModCount不一致,就会抛出异常。
在遍历集合的同时需要对元素进行add和remove操作,推荐使用iterator方式。
上面实例改下如下:
List<Integer> list = new ArrayList<Integer>();
for(int i=1;i<=10;i++){
list.add(i);
}
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
Integer item = iterator.next();
if(item%3==0){
iterator.remove();
}
}
System.out.println(list);
运行结果:
[1, 2, 4, 5, 7, 8, 10]
如果使用iterator方式修改元素时需要并发操作,需要对iterator对象加锁,实现同步操作。