如下操作:
ArrayList<String> list1= new ArrayList<String>();
initData(list1);
for(String str:list1){
if("name1".equals(str)){
list1.remove(str);
}
}
这样遍历去移除一个对象,会抛出
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 Main.main(Main.java:10
两种办法
第一种也是大多数初学者采用的办法。
int size = list1.size();
int index = 0;
for (int i = 0; i < size; i++) {
if ("name2".equals(list1.get(i))) {
index = i;
break;
}
}
list1.remove(index);
第二种,就是使用迭代器来处理:
ArrayList<String> list1 = new ArrayList<String>();
initData(list1);
Iterator<String> iterator = list1.iterator();
while (iterator.hasNext()) {
String value = iterator.next();
if ("name2".equals(value)) {
iterator.remove();
System.out.println(list1);
break;
}
}
Iterator 支持从源集合中安全地删除对象,只需在 Iterator 上调用 remove() 即可。这样做的好处是可以避免 ConcurrentModifiedException ,这个异常顾名思意:当打开 Iterator 迭代集合时,同时又在对集合进行修改。有些集合不允许在迭代时删除或添加元素,但是调用 Iterator 的 remove() 方法是个安全的做法。