java - 为什么我会收到 ConcurrentModificationException?

标签 java linked-list priority-queue

为什么我在代码中的指定位置收到 ConcurrentModificationException?我无法弄清楚我做错了什么... removeMin() 方法用于在列表 pq 中定位 min,将其删除并返回其值

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

public class test1 {

    static LinkedList<Integer> list = new LinkedList<Integer>();

    public static void main(String[] args) {
        list.add(10);
        list.add(4);
        list.add(12);
        list.add(3);
        list.add(7);

        System.out.println(removeMin());
    }

    public static Integer removeMin() {
        LinkedList<Integer> pq = new LinkedList<Integer>();
        Iterator<Integer> itPQ = pq.iterator();

        // Put contents of list into pq
        for (int i = 0; i < list.size(); i++) {
            pq.add(list.removeFirst());
        }

        int min = Integer.MAX_VALUE;
        int pos = 0;
        int remPos = 0;

        while (itPQ.hasNext()) {
            Integer element = itPQ.next(); // I get ConcurrentModificationException here
            if (element < min) {
                min = element;
                remPos = pos;
            }
            pos++;
        }

        pq.remove(remPos);
        return remPos;
    }

}

最佳答案

一旦从中获取迭代器的集合被修改,迭代器就不应被视为可用。 (对于 java.util.concurrent.* 集合类,此限制有所放宽。)

您首先获得 pq 的迭代器,然后修改pq 。一旦修改pq ,迭代器itPQ不再有效,因此当您尝试使用它时,您会收到 ConcurrentModificationException。

一种解决方案是移动 Iterator<Integer> itPQ = pq.iterator();while 之前环形。更好的方法是完全取消 Iterator 的显式使用:

for (Integer element : pq) {

从技术上讲,for-each 循环在内部使用迭代器,因此无论哪种方式,只有当您不尝试修改 pq 时,此循环才有效。在循环内。

关于java - 为什么我会收到 ConcurrentModificationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44445668/

相关文章:

java - MqttPahoMessageHandler 和重连率管理

java - 从字符串解析到日期

带有动态优先级标志的java队列

c++ - 在 boost::heap::priority_queue 中推送结构对象时出错

java - 使用正则表达式解析大字符串以获取 java.lang.StackOverflowError 错误

java - 安卓、Java : Resized Bitmap ignores bitmap options

java - 删除单链表中第二次出现的特定对象

java - java中的链表教程

java - java中队列的链表实现中的大小无法正确计算

javascript - 使用堆的优先级队列 - JavaScript 和 C++ 实现之间的区别