Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iterator for Java Framework集合的不同结果_Java_Collections_Foreach_Iterator - Fatal编程技术网

Iterator for Java Framework集合的不同结果

Iterator for Java Framework集合的不同结果,java,collections,foreach,iterator,Java,Collections,Foreach,Iterator,我对迭代器在主要Java框架集合类(不仅仅是List类)上的不同行为有一些疑问 名单 如果我为每个人都写,我会有一个例外: Collection<String> cc= new ArrayList<>(3); cc.add("Cio"); cc.add("Mio"); cc.add("Tio"); for (String s:cc) { System.out.println(s); cc.remove(s);

我对迭代器在主要Java框架集合类(不仅仅是List类)上的不同行为有一些疑问

  • 名单
  • 如果我为每个人都写,我会有一个例外:

    Collection<String> cc= new ArrayList<>(3);
            cc.add("Cio");
            cc.add("Mio");
            cc.add("Tio");
    for (String s:cc) {
        System.out.println(s);
        cc.remove(s);            //Exception
    }
    
    for (Iterator<String> it =cc.iterator(); it.hasNext();) {
        String s =it.next();
        if (s.startsWith("C"))
            it.remove();
    }
    
    ArrayDeque<String> greetings = new ArrayDeque<String>();
            greetings.push("hello");
            greetings.push("hi");
            greetings.push("ola");
            greetings.pop(); 
            greetings.peek();
            while (greetings.peek() != null)
            System.out.print(greetings.pop());
    
    Iterator<String> it = greetings.iterator();
            while(it.hasNext()) {
                System.out.println(greetings.pop()); //Exception
            }
    
    Collection cc=newarraylist(3);
    抄送添加(“Cio”);
    抄送添加(“Mio”);
    cc.添加(“Tio”);
    for(字符串s:cc){
    系统输出打印项次;
    cc.remove(s);//异常
    }
    
    如果使用迭代器,则不会出现异常:

    Collection<String> cc= new ArrayList<>(3);
            cc.add("Cio");
            cc.add("Mio");
            cc.add("Tio");
    for (String s:cc) {
        System.out.println(s);
        cc.remove(s);            //Exception
    }
    
    for (Iterator<String> it =cc.iterator(); it.hasNext();) {
        String s =it.next();
        if (s.startsWith("C"))
            it.remove();
    }
    
    ArrayDeque<String> greetings = new ArrayDeque<String>();
            greetings.push("hello");
            greetings.push("hi");
            greetings.push("ola");
            greetings.pop(); 
            greetings.peek();
            while (greetings.peek() != null)
            System.out.print(greetings.pop());
    
    Iterator<String> it = greetings.iterator();
            while(it.hasNext()) {
                System.out.println(greetings.pop()); //Exception
            }
    
    for(Iterator it=cc.Iterator();it.hasNext();){ 字符串s=it.next(); 如果(s.startsWith(“C”)) it.remove(); }
  • 阿莱德克
  • 这对于ArrayDeque是不同的,事实上,如果我对每一个都使用,我会 没有例外:

    Collection<String> cc= new ArrayList<>(3);
            cc.add("Cio");
            cc.add("Mio");
            cc.add("Tio");
    for (String s:cc) {
        System.out.println(s);
        cc.remove(s);            //Exception
    }
    
    for (Iterator<String> it =cc.iterator(); it.hasNext();) {
        String s =it.next();
        if (s.startsWith("C"))
            it.remove();
    }
    
    ArrayDeque<String> greetings = new ArrayDeque<String>();
            greetings.push("hello");
            greetings.push("hi");
            greetings.push("ola");
            greetings.pop(); 
            greetings.peek();
            while (greetings.peek() != null)
            System.out.print(greetings.pop());
    
    Iterator<String> it = greetings.iterator();
            while(it.hasNext()) {
                System.out.println(greetings.pop()); //Exception
            }
    
    ArrayDeque问候语=new ArrayDeque();
    问候。推(“你好”);
    问候。推(“嗨”);
    问候。推(“ola”);
    您好。pop();
    你好。peek();
    while(问候语.peek()!=null)
    System.out.print(greetings.pop());
    
    但是如果我使用迭代器,我会有一个例外:

    Collection<String> cc= new ArrayList<>(3);
            cc.add("Cio");
            cc.add("Mio");
            cc.add("Tio");
    for (String s:cc) {
        System.out.println(s);
        cc.remove(s);            //Exception
    }
    
    for (Iterator<String> it =cc.iterator(); it.hasNext();) {
        String s =it.next();
        if (s.startsWith("C"))
            it.remove();
    }
    
    ArrayDeque<String> greetings = new ArrayDeque<String>();
            greetings.push("hello");
            greetings.push("hi");
            greetings.push("ola");
            greetings.pop(); 
            greetings.peek();
            while (greetings.peek() != null)
            System.out.print(greetings.pop());
    
    Iterator<String> it = greetings.iterator();
            while(it.hasNext()) {
                System.out.println(greetings.pop()); //Exception
            }
    
    Iterator it=greetings.Iterator();
    while(it.hasNext()){
    System.out.println(greetings.pop());//异常
    }
    
    为什么??迭代器是否会为其他JFC集合抛出异常,特别是:HashSet、TreeSet、LinkedList

    非常感谢


    A.

    阵列列表

    列表维护一个
    modCount
    字段,该字段在每次对列表进行结构修改时递增

    结构修改是指改变列表大小的修改, 或者以某种方式干扰它,使迭代进行中 可能会产生错误的结果

    进一步

    如果此字段的值意外更改,则迭代器(或列表 迭代器)将抛出ConcurrentModificationException以响应 下一步、删除、上一步、设置或添加操作。这就提供了 快速失效行为,而不是表面上的非确定性行为 迭代过程中并发修改的实例。通过 子类是可选的

    如果子类希望提供fail fast迭代器(和list 迭代器),则只需在其add(int)中增加此字段, E) 和删除(int)方法(以及它覆盖的任何其他方法) 这将导致对列表进行结构修改

    列表迭代代码的两种形式:

    一,

    二,

    --它的工作方式与其对应的
    ArrayList
    完全相同

    调用ArrayQue类的
    pop()
    push()
    方法时,实际上并不在队列上进行迭代,只需修改队列的头部或尾部。这就像在不进行迭代时调用ArrayList类的remove()方法(而不是ArrayList的迭代器的remove())。这不符合结构修改的条件。因此不会引发异常


    请参阅文章。

    Iterator不反映基础列表中的更改。可能存在@ghoul932的重复,但仅适用于列表?为什么在ArrayDeque中它(Iterator)会引发异常?在您的链接中,参数仅适用于列表。我想知道其他JFC集合的行为。您没有使用
    it.next()
    。有些集合提供了一致性。请查看包
    java.util.concurrent