这是代码的流程图
上面的函数代码和下面的函数代码都能够编译通过,编译器只检查基本的语法,函数调用在运行时检查吧。
上面的代码运行结果为day02 day04;整个循环过程中没有调用到集合对象al的操作元素的方法add();
所以没有发生ConcurrentModificationException异常;
下面的代码在第二次循环的时候,(it.next()).eauals("java02")条件,满足,所以要调用到集合对象al的操作元素的方法add();
这时虚拟机就会报出异常ConcurrentModificationException;
这个异常一般发生在集合的操作中,在集合的迭代器中进行集合元素的操作,有两种方法,第一种用迭代器的方法如it.next() ,
调用迭代器的方法去操作集合中的元素,;第二种用集合的方法,如al.add()。
但是如果在迭代器中同时使用两种方法的话(编译时并没有报错),就可能会发生异常,
发生异常的情况是:在迭代器中同时调用到了两种方法的话,也就是你的下面一个代码!
原因是:在进入循环进行操作元素之前,迭代器对象已经通过这句话Iterator it = al.iterator();得到了al集合中的元素信息,
比如说你的代码中,it已经记录了集合中有day01,day02,day03,day04四个元素。
1如果仅仅只是用迭代器的方法来操作集合元素的话,如it.next(),那么迭代器对象it就还会获取al集合的元素信息。
比如al集合中的元素多了,少了,it都知道,这样it继续对集合元素进行操作就不会出错。
2,如果 在使用迭代器中的方法 的同时,你又使用了al对象中操作元素的方法,如al.add(),那么迭代器对象it就不会知道 al.add()所带来的元素信息的变化。
迭代器对象it不知道新添加了哪个元素或删除了哪个元素,这样,在进行以后循环的时候,可能会发生逻辑上错误。
所以jvm要报出异常,希望用户通过代码避免这种情况的发生。
3,所以最好还是在迭代器中只使用迭代器it的方法 来操作元素,这样是绝对安全的。
后面还有其他的迭代器的实现类,提供了更多的方法来帮助用户操作集合对象中的元素。
累死我了......
|