比较好的删除集合中元素的做法。方法(1): public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(1);
list.add(5);
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Integer value = iterator.next();
if (value == 1) {
iterator.remove();
}
}
System.out.println(list); }方法(2):可以看到这里不调用hasNext()也是可以的 public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(1);
list.add(5);
Iterator iterator = list.iterator();
int len = list.size();
int index = 0;
while (len > 0 && index <= len) {
Integer value = iterator.next();
if (value == 1) {
iterator.remove();
}
index++;
len = list.size();
}
System.out.println(list); }也可以知道iterator.remove()方法里面肯定改变了expectedModCount,使其等于modCount的值,然后再次调用iterator.next()方法的时候不会报错,看看ArrayList里面的源码public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}再看看如下代码:public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(1);
list.add(5);
Iterator iterator = list.iterator();
list.add(1234);
while (iterator.hasNext()) {
Integer value = iterator.next();
if (value == 1) {
iterator.remove();
}
}
System.out.println(list); } 还是会报这个错误,Exception in thread "main" java.util.ConcurrentModificationException,现在比较好理解了,初始化的时候iterator里面expectedModCount值已经为5了,然后执行list.add(1234),modCnt为6,但是expectedModCount还是为5。所以出现错误了。总结:在iterator执行的代码段里面,最好不要混合集合的add和remove操作。集合的add和remove操作,应该在iterator执行的代码端之前或之后。