gpt4 book ai didi

java - 使用 PriorityQueue 时出现 ConcurrentModificationException

转载 作者:搜寻专家 更新时间:2023-11-01 01:16:58 25 4
gpt4 key购买 nike

我正在使用 for-each 循环遍历 PriorityQueue 并尝试轮询它。

为什么我得到 java.util.ConcurrentModificationException?正如异常名称所暗示的那样,我在哪里修改“concurrently”?是否在内部使用 poll() 时为自己分配修改?请解释。

Snippet:

String[] sa = {">ff<", "> f<", ">f <", ">FF<"};
//This code demonstrates that white spaces come before capital letters and
//capital letters come before the small letters in natural ordering
PriorityQueue<String> pq = new PriorityQueue<String>();
for (String str : sa) {
pq.offer(str);
}
System.out.println(pq);
for (String str : pq) {
System.out.print(pq.poll() + " ");
}
}

编辑:

正如我从下面给出的解释中理解的那样,每次 poll() 方法调用都会导致 PriorityQueue 对象的大小发生变化。因此,在迭代和尝试轮询时抛出异常是有意义的(不断改变大小)。因此 pq 对象抛出一个用词不当的异常。我的理解正确吗?

最佳答案

您在迭代 (for (String str : pq)) 的同时修改它 (pq.poll())。

尽管顾名思义,这里的并发并不意味着多线程意义上的并发。它只是意味着“同时”。具体来说,如果您在迭代期间修改了大多数集合类(就像您在本例中所做的那样),它们将抛出 ConcurrentModificationException。请注意,并非所有他们都这样做;特别是,为多线程访问而设计的那些则不然。但是大多数基本的,例如 PriorityQueue,都可以。

关于java - 使用 PriorityQueue 时出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22876963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com