java - [Java]Queue在while循环中,无法修改值?

标签 java exception queue while-loop

这是我的代码:

Iterator it = queue.iterator();

while(it.hasNext()){
   random = randNumber(1,2);
        if(random == 1){
            queue.poll();
        } else {
            queue.add("new");
            queue.poll();
        }
}

它给了我:

Exception in thread "test" java.util.ConcurrentModificationException
    at java.util.LinkedList$ListItr.checkForComodification(LinkedList.java:761)
    at java.util.LinkedList$ListItr.next(LinkedList.java:696)

编辑@Jon Skeet:

我想做的是:

  • 我有一个队列列表,假设大小为 10,假设:a,b,c,d ... j
  • 生成一个介于 1 和 2 之间的数字。如果为 1,则拉出(删除顶部元素),否则如果为 2,则添加新元素
  • 我将停止循环,直到添加 3 个新元素

最佳答案

一般来说,在迭代集合时不能修改集合。一种替代方法是构建一个单独的要应用的“更改”列表,然后在完成迭代后应用它们。

或者,某些集合确实支持此功能,例如ConcurrentLinkedQueue - 但大多数集合不保证迭代器是否会看到您迭代时所做的更改。 (我怀疑这主要是因为它们也是线程安全的,但我很少看到有记录的保证,说明如果您在迭代线程中修改集合会发生什么。)

编辑:我不确定迭代器是否是正确的方法。相反,您可以使用:

while (!queue.isEmpty())
{
    // Put logic in here - add, poll etc
}

需要注意的一件事是,您发布的代码实际上并不随时向前移动迭代器 - 它从不调用 it.next()。这是一个强烈的建议,表明您要么没有完全使用迭代器,要么根本不需要它。

关于java - [Java]Queue在while循环中,无法修改值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2813297/

相关文章:

java - Servlet getParameter() 返回 null 但值被传输

android - 完成 Activity 时出现 MediaPlayer 异常

ios - 在哪些队列中执行 Collection View 的委托(delegate)/数据源方法?

java - RDF 与其他数据集互连

java - BitmapFactory : Unable to decode stream: java. io.FileNotFoundException:打开失败:ENOENT(没有这样的文件或目录)

java - 线程是否根据各自的优先级编号工作?

linux - 为什么异常处理程序要查找系统调用表?

c - 写入 double 浮点时处理ecos中未对齐的写入

java - 从队列中调度任务

javascript - 在 Typescript 中实现 Bull Queue