gpt4 book ai didi

Java在不同地方同时修改列表

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:07:58 24 4
gpt4 key购买 nike

我有一段代码,我在其中使用迭代器遍历 ArrayList,例如:

Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Element element = iterator.next();
iterator.remove();
handle(element)
}

其中 ´handle(Element element)` 是这样的:

ListIterator iterator = list.listiterator();
iterator.add(element);

现在这给出了一个 ConcurrentModificationException,因为第一个方法中的 iterator 没有用新添加的元素更新。

我目前已经使用 CopyOnWriteArrayList 解决了这个问题,但是这些对于性能来说是非常昂贵的。有没有更好的方法来解决这个问题?

提前致谢!

(注意:该示例没有任何意义,但用于说明我所面临的问题)


我将尝试解释我这样做的原因:

  • 我的主类中有一个需要执行的“命令”列表

  • 我有一个 while 循环(示例中的代码 1)迭代这些命令并逐一执行它们,同时在从列表中执行时删除它们。

  • 在执行命令时,该命令可以依次将新命令添加到保存在我的主类中的列表中。 (这实际上有点复杂:处理一个命令需要客户端的响应,而客户端又会响应一个命令,并且该命令将被添加到保存的列表中)。

最佳答案

鉴于上述要求,简单的解决方案是使用 Queue ( javadoc ) 而不是 List

I have a list of 'commands' in my main class that need to be executed

Queue 可以表示一系列命令。

I have a while-loop (code 1 in the example) that iterates over these commands and execute them one-by-one, while removing them when executed from the list.

Queue 的等价物是重复调用 remove()poll() 等来获取和删除第一个命令来自队列。您重复执行此操作,直到 Queue 为空。

请注意,这不涉及Iterator

While executing a command, this command can in its turn add a new command to the list that is saved in my main class.

这可以通过调用 add()offer() 将命令添加到 Queue 来完成。


请注意,Queue 有许多不同的实现,具有不同的属性:

  • 有限或无限大小的队列
  • 阻塞或不阻塞的队列
  • 简单的 FIFO 队列与 LIFO 队列或优先队列

关于Java在不同地方同时修改列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36524376/

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