rayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
在 remove() 方法的方法体里,有“expectedModCount = modCount; “这样一行语句,那么不管我们调用多少次迭代器的 remove() 方法,始终会让 expectedModCount 的数值等于 modCount 的值,这里的 expectedModCount 可理解为使用迭代器对容器类对象进行修改的”期望修改次数“,就是说:迭代器里的这个”期望修改次数“一定要和已经记录下的容器的修改次数 modCount 一样,那么当你通过迭代器对容器类对象遍历并进行修改时,使用迭代器本身的 remove() 才有意义(即让 expectedModCount = modCount)!!而在 next() 方法体里首行的 checkForComodification() 方法是这样定义的:
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
看了源码,我们应该知道: checkForComodification() 的作用是检查 expectedModCount 和 modCount 的值是否相等,如果不等,则抛出 ConcurrentModificationException 这个异常。这下显而易见了,在我们通过迭代器进行遍历时,若使用非迭代器对象提供的修改容器类对象的任何方法,则 modCount 的值增大,而 expectedModCount 地值不发生改变,那么在进入下一次循环时,next() 方法体里首行的 checkForComodification() 方法检查到 expectedModCount 与 modCount 不等后抛出了 ConcurrentModificationException。
那么,在通过迭代器进行迭代时,容器对象里的任何元素都不能通过容器类所提供的方法进行增删改的操作么?非也非也,Alei留下这样一段代码:
public static void main(String[] args) {
Collection c = new ArrayList();
c.add(new String("aaa"));
c.add(new String("bbb"));
c.add(new String("ccc"));
c.add(new String("ddd"));
c.add(new String("fff"));
c.add(new String("eee"));
for (Object o : c) {
// System.out.print(o + " ");
if (o.equals("fff")) {
c.remove(o);
}
}
System.out.println(c);
}
当我们运行这段程序,你将会发现 ”fff“ 这个字符串对象怎么被成功删除了?!这也是我之前一直疑惑且略显白痴的地方。其实,我可以下定结论:在通过迭代器进行迭代时,容器对象里的倒数第二个元素一定可以过容器类所提供的 remove() 方法进行删除操作(不管这个容器的 size 有多大)。这又是为什么呢?哈哈,对于这个问题,留待小伙伴们自行解决吧^_^!