A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Amu 中级黑马   /  2015-5-30 23:54  /  571 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当迭代器去集合元素进行迭代时,当调用集合方法对集合进行增加或删除元素时,会发生并发修改异常,但
用集合方法对元素进行修改时并不会发生异常,这是为什么类

5 个回复

倒序浏览
看码。。。


  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;
  4. import java.util.ListIterator;

  5. public class CollectionTest1 {
  6. public static void main(String[] args) {
  7.         List list = new ArrayList();
  8.         list.add( "hello");
  9.         list.add ("world");
  10. //        Iterator it =list.iterator();
  11. //        while(it.hasNext()){
  12. //                String s = (String) it.next();
  13. //                if("hello".equals(s)){
  14. //                        list.add("IOS");
  15. //                }
  16.         ListIterator it =list.listIterator();
  17.         while(it.hasNext()){
  18.                 String s = (String) it.next();
  19.                 if("hello".equals(s)){
  20.                         it.add("IOS");
  21.                 }
  22.         }System.out.println(list);
  23. }
  24. }
复制代码

因为第一种使用List里面add方法添加元素。集合变了,而迭代器并没有修改。所以并发修改异常
回复 使用道具 举报

手贱,提交了。。

第二种,是用迭代器 it 本身的 add方法添加。这时候的元素是添加到遍历的元素后边的,所以木有异常。
回复 使用道具 举报
:victory:
我再乱说一句,迭代器运行后会有一个自己的缓存数据,利用自己增删方法时,会连集合内一起修改
但如果只是集合方法的话 迭代器来不及COPY ,所以一生气就挂了
回复 使用道具 举报
因为迭代器通过原集合的iterator 方法获取的,hasNaxt 方法是在判断迭代器中是否还有下一个元素,next 是在获取下一个可以迭代的元素,如果你在迭代获取元素的过程增删,就导致现有的集合和原有集合元素数量的不一致,hasNext 和next 有可能就迭代不到相应的元素,我是这么理解的
回复 使用道具 举报
我是这么理解的:在迭代的过程当中,对元素进行修改并不会破坏迭代器指针的指向,如果进行增删是话,只能使用迭代器的remove进行删除,不能使用集合的增删方法,因为会改变迭代器指针的指向,(对于无序的set)可能会使一个数据迭代了多次,引发迭代异常

若果理解有误,大家可以探讨一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马