从 CopyOnWriteArrayList 中删除元素

2022-09-04 05:45:16

当我尝试使用迭代器从CopyOnWriteArrayList中删除元素时,我遇到了异常。我注意到它是有文档记录的

不支持对迭代器本身执行元素更改操作(移除、设置和添加)。这些方法会引发“不支持的操作异常”。

由 http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)

现在,令人惊讶的是,我可以用foreach迭代它并使用demove()函数。但是,我得到了一个著名的错误 - 当尝试使用for循环从列表中删除项目时 - 你跳过已删除元素旁边的元素。有什么建议吗?


答案 1

循环访问集合,选择要删除的所有元素,然后将这些元素放入临时集合中。完成迭代后,使用方法 removeAll 从原始集合中删除所有找到的元素。

这对你有用吗?我的意思是,不确定删除逻辑是否比算法中的逻辑更复杂。


答案 2

编辑:我是个白痴。我错过了这样一个事实,即这是一个写入时复制列表,因此每次删除都意味着一个新副本。因此,如果有多个删除,我下面的建议可能是次优的。

与迭代器不支持 remove 的任何其他列表相同,或者您不使用迭代器的任何内容。有三种基本技术可以避免此错误:

  1. 删除某些内容后递减索引(在下一次迭代之前,请注意不要对索引执行任何操作)。为此,您显然必须使用...for 循环的样式,以便您可以操作索引。for(int i=0; i <

  2. 以某种方式重复循环内部正在执行的操作,而不会真正返回到循环的顶部。有点黑客 - 我会避免这种技术。

  3. 反向循环访问列表(从头到尾,而不是从头到尾)。我更喜欢这种方法,因为它是最简单的。


推荐