比较好的删除集合中元素的做法。
方法(1):
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(1);
list.add(5);
Iterator<Integer> 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<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(1);
list.add(5);
Iterator<Integer> 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);
}
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<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(1);
list.add(5);
Iterator<Integer> 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执行的代码端之前或之后。