这是我的代码:
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/