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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 申俊伟 于 2012-9-6 21:13 编辑
  1. List<String> allList=new ArrayList<String>();//创建ArrayList实例
  2.         //向其中增加元素
  3.         allList.add("hello");
  4.         allList.add( "world");
  5.         allList.add("heima");
  6.         allList.add("itcast.cn");
  7. Iterator<String> it=allList.iterator();//创建迭代器
  8.                 while(it.hasNext()){
  9.                         String str=it.next();
  10.                         if("heima".equals(str))
  11. {
  12.                             <font color="Red">// it.remove();
  13.                                 allList.remove(str);//删除元素</font>
  14.                                 }
  15.                         else
  16.                         {
  17.                                 System.out.print(str+",");
  18.                         }
  19.                 }

复制代码
(标红的代码)!上述代码使用it.remove()方法,即注释了的语句(使用的迭代器中的方法)后程序输出正常,但使用ArrayList中的方法allList.remove(str)方法后只能输出[hello,world,],但itcast.cn没有被删除啊,为什么没有输出?不是这两种方法都能删除集合中的元素吗?


评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 武庆东 于 2012-9-6 18:42 编辑

List<String> allList=new ArrayList<String>();//创建ArrayList实例
        //向其中增加元素
        allList.add("hello");
        allList.add( "world");
        allList.add("heima");
        allList.add("itcast.cn");
Iterator<String> it=allList.iterator();//创建迭代器
                while(it.hasNext()){
                        String str=it.next();
                        if("heima".equals(str))
{
                            <font color="Red">// it.remove();    代号1
                                allList.remove(str);//删除元素</font>  代号2
                                }
                        else
                        {
                                System.out.print(str+",");
                        }
                }


(标红的代码)!上述代码使用it.remove()方法,即注释了的语句(使用的迭代器中的方法)后程序输出正常,但使用ArrayList中的方法allList.remove(str)方法后只能输出[hello,world,],但itcast.cn没有被删除啊,为什么没有输出?不是这两种方法都能删除集合中的元素吗?
  在进行集合的迭代输出时不能进行remove()操作,编译时不报错,运行时会报告                    ConcurrentModificationException 异常!   你这个在运行时没有报错,是因为it.remove()至始至终都没有进行实际操作

  



回复 使用道具 举报
      Iterator 是工作在一个独立的线程中,并且线程同步。
    Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
    所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性, 所以当你使用it.remove()时,得到正确的结果.

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 鼓励鼓励!

查看全部评分

回复 使用道具 举报
用迭代器遍历的时候,处于线程同步的状态,只能使用迭代器的remove()方法来删除容器中的元素.
这是个知识点,记住就是了.
回复 使用道具 举报
      二楼说的比较好。简单来说Iterator迭代器就是一个因定的映射,一旦确定就不好再进行改动(当然自身带有三个方法可以使用,如果想有更多的操作,比如增加,可以使用它的子类ListIterator),如果不是调用Iterator自身方法而使用集合方法就会抛出ConcurrentModificationException同步异常。
    你的问题是你用it.remove();可正常操作,使用allList.remove()时会先产生异常,会直接中断跳出。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马