【问题标题】:Java LinkedList ConcurrentModificationException [duplicate]Java LinkedList ConcurrentModificationException [重复]
【发布时间】:2016-12-23 16:52:55
【问题描述】:

我为 LinkedList 编写了一个简单的代码,向其中添加数据并对其进行迭代,
我为 LinkedList 和 Iterator 导入了所需的包, 代码中没有错误,

我收到以下异常 -

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
    at java.util.LinkedList$ListItr.next(Unknown Source)
    at collectionFramework.Demo.displayList(LinkedListDemo.java:38)
    at collectionFramework.LinkedListDemo.main(LinkedListDemo.java:13)

这是我的代码 -

package collectionFramework;

import java.util.Iterator;
import java.util.LinkedList;

public class LinkedListDemo{

    public static void main(String[] args) {

        Demo obj = new Demo();

        obj.addToList();
        obj.displayList();
    }

}

class Demo{

    LinkedList<String> al;
    Iterator<String> itr;  

    Demo(){
        al = new LinkedList<String>();
        itr = al.iterator();
    }

    void addToList(){
          al.add("Aniruddha");  
          al.add("Hitesh");  
          al.add("Rahul");  
          al.add("Kshitij");  
    }

    void displayList(){

        while(itr.hasNext()){  
               System.out.println(itr.next());  
        }
    }
}

【问题讨论】:

    标签: java linked-list iterator


    【解决方案1】:

    你应该在你的显示方法中得到iterator,比如:

    void displayList(){
        itr = al.iterator();
        while(itr.hasNext()){  
               System.out.println(itr.next());  
        }
    }
    

    对于LinkedList有一个字段modCount,这个字段用来记录这个列表被结构化修改的次数。

    此列表被结构修改的次数。 结构修改是那些改变尺寸的 列出,或以其他方式扰乱它,使得迭代 进度可能会产生不正确的结果。

    当你第一次创建iterator时,modCount0,因为ListItr已经记录了expectedModCount=modCount=0,修改后列表modCount 已更新,例如 4

    迭代器时,会比较迭代器的expectedModCountList modCount,如果不相等,则抛出ConcurrentModifyExpection

    【讨论】:

    • 因为......在构造函数中创建了interator之后,addList被调用,改变(同时)列表,并且在displayList中第一次使用迭代器时它检测到并发更改。
    • 正确,很好。迭代器创建得太早,然后将项目添加到集合中,从而使迭代器无效。使用不再有效的迭代器时抛出异常。
    【解决方案2】:

    从列表中获取迭代器后,您无法在列表中添加或删除元素。 以下代码应该可以工作。

    void displayList(){
        Iterator<String> itr = al.iterator();
        while(itr.hasNext()){  
               System.out.println(itr.next());  
        }
    }
    

    更多阅读请参考以下链接:

    Iterating through a Collection, avoiding ConcurrentModificationException when removing in loop

    http://javahungry.blogspot.com/2014/04/fail-fast-iterator-vs-fail-safe-iterator-difference-with-example-in-java.html

    【讨论】:

      【解决方案3】:

      首先你得到

       itr = al.iterator();
      

      然后你添加一些元素到列表中

      al.add("Aniruddha");  
      al.add("Hitesh");  
      al.add("Rahul");  
      al.add("Kshitij");  
      

      这使得迭代器过时了。

      你应该在显示列表之前获取新的迭代器

      void displayList(){
          itr = al.iterator();
          while(itr.hasNext()){  
                 System.out.println(itr.next());  
          }
      }
      

      或者通过迭代器添加元素:

      itr.add("Aniruddha");  
      itr.add("Hitesh");  
      ...  
      

      但这不是你想要的,因为itr 上的hasNext() 将返回 false

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 2014-09-17
        • 2021-07-01
        • 1970-01-01
        • 2011-03-12
        相关资源
        最近更新 更多