Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';发布';Java中列表上的迭代器_Java_Collections - Fatal编程技术网

';发布';Java中列表上的迭代器

';发布';Java中列表上的迭代器,java,collections,Java,Collections,我正在尝试编写一个游戏引擎,其中一个精灵列表用于保存所有精灵(列表列表允许我以合理的方式排列精灵)。问题是,我需要反复添加和删除sprite,这很快就违反了fail-fast迭代器,给了我一个并发修改异常。我可以在一个列表上有多个迭代器吗?这会阻止异常吗?如果做不到这一点,是否有办法“释放”列表的迭代器,使列表不再检查修改 我可以在一个列表上有多个迭代器吗?这会阻止异常吗 是的,你可以,但不会。(迭代器检查列表的状态,以确定是否发生了并发修改。) 如果做不到这一点,是否有办法“释放”列表的迭代器

我正在尝试编写一个游戏引擎,其中一个精灵列表用于保存所有精灵(列表列表允许我以合理的方式排列精灵)。问题是,我需要反复添加和删除sprite,这很快就违反了fail-fast迭代器,给了我一个并发修改异常。我可以在一个列表上有多个迭代器吗?这会阻止异常吗?如果做不到这一点,是否有办法“释放”列表的迭代器,使列表不再检查修改

我可以在一个列表上有多个迭代器吗?这会阻止异常吗

是的,你可以,但不会。(迭代器检查列表的状态,以确定是否发生了并发修改。)

如果做不到这一点,是否有办法“释放”列表的迭代器,使列表不再检查修改

不,没有,至少在标准列表类中没有。这将是一个坏主意,因为这可能会导致异常和数据损坏,而fail fast迭代器的设计就是为了避免这些异常和数据损坏。(您希望您的应用程序因ConcurrentModificationException而意外失败,还是偶尔因随机数据结构损坏和/或奇怪的异常而失败?)

我认为您需要查看替代列表实现类,其中迭代器允许并发修改。根据应用程序使用列表的方式,可能包括:

  • CopyOnWriteArrayList
    这具有完整的列表语义,但写入操作往往有点昂贵

  • ConcurrentLinkedQue
    这是您在列表上期望的大多数操作(但不是位置插入或删除),而写入操作更便宜

在这两种情况下,迭代器对迭代是否会看到所有元素提供了较弱的保证。您需要仔细阅读相应的javadoc,以确保语义是合适的


除了几个历史例外,
java.util
中的集合类型不是为并发/多线程用例设计的。如果您的应用程序需要由多个线程访问的集合类型,则需要查看
java.util.concurrent
包中的实现。

如果您希望迭代列表的内容,因为它们在特定时间存在,而与迭代过程中发生的任何修改无关,您只需创建一个副本并在副本上迭代即可


从性能的角度来看,这听起来可能很吓人,但我鼓励你尝试一下,只考虑替代品(如 CopyOrthRealRayList),如果剖析实际上表明创建副本是你已完成的应用程序中的一个热点。垃圾收集器非常擅长使这些副本这样的短期对象运行良好。

告诉他关于
java.util.concurrent…
还有google collections-guava有一些并发实现,可能值得一看。它不是并发的。列表在单个线程中引用,但是添加和删除是独立于遍历而完成的,遍历会导致不幸命名为ConcurrentModificationException。@DaedaluseSedPerl-没关系,它们可以工作。(如果你能想出一个比
ConcurrentModificationException
更好/更合适的名字,我很想听听……
UnauthorizedModificationException
UnsafeModificationException
这是一个意外的例外
OhWaitisException
YesiamalittledWhiththis exception
所有这些都会出现在我的脑海中。如何标记需要删除的精灵,然后分组删除它们?我已经这样做了,但添加精灵仍然存在问题。