关于迭代器

391 阅读2分钟

Iterator 是JAVA里的迭代器接口,迭代器是用来遍历集合的一种方式,并因此产生了以迭代器为核心的增强For语句。

可是最近我发现了一个问题,既然加强for核心是迭代器,那就存在对next方法的使用。

Iterator迭代器在next里有对修改次数的要求,当其遍历的集合被修改时,会抛出ConcurrentModificationException错误(并发异常)

也就是说,如果在加强for里对遍历集合进行修改,就会报错。


``````for(String s:array){
    System.out.println(s);
    array.add("hello");
}

```//array:{"hello","world",“Java”}

抛出了ConcurrentModificationException错误

但是另外一种就不行

````Iterator<String> it;
//        while (it.hasNext()){
//            System.out.println(it.next());
//        }
        it=new ArrayList<String>(array).iterator();


       
        for(int i=0; it.hasNext();i++){
            array.add("hello");

            System.out.println(it.next());
            array.add("java");
        }

同样是迭代器,这个就没有报错,于是我对这种进行了特殊的测试,

`````````//不明白同样是Iterator,为什么这里修改就不会报错
for(int i=0; it.hasNext();i++){
    array.add("hello");

    System.out.println(it.next());
    array.add("java");
}

//调试结果显示Iterator 遍历的是修改前的array,当next被调用时,Iterator就确定了它要遍历的集合
System.out.println("----------");
for(int j=0;j<array.size()-1;j++){
    System.out.println(array.get(j));
}
//测试完毕,Iterator确实如上所说,当next被调用时 遍历的集合就已经确定,
//也就是说,后续array通过add添加的元素数量应该与初始元素数量相等
//结果确实如此

结果如上,特别的,我还做了一些其他的测试

``````for(; it.hasNext();){//it 是以ArrayList 为基础的迭代器
//            String s=it.next();
            System.out.println(it.next());
            array.add("hi");
        }
        for(; it1.hasNext();){//it1是以LinkedList 为基础的迭代器
            System.out.println(it1.next());
            x.add("javaee");
        }

```结果是上面一部分没出错,而下面的直接报错

  • 虽然我目前还不清楚到底是为什么产生了这些情况,但这些可以说明迭代器面对以不同数据结构为底层的家伙具有不同的作用。
  • 仅以此博客,记下这个问题。
  • 得 别的也想不出来了,反正Java后面是越来越复杂了【恼】
  • 就这样了。。。

Code_back.jpg