Java LinkedList 保留对节点的引用并添加

标签 java

我正在使用 Java 中的 LinkedList 工作,我使用一个线程在列表中添加和删除项目。我只在头部添加元素,因为我将列表用作队列。我可能会添加一个元素,使用节点删除它,然后添加另一个元素等。因为它是双链接的,所以显然是有可能的。

我应该能够保留对节点的引用,这是通过 Java 中的迭代器完成的,但是当我创建一个迭代器然后向链表添加一些内容,然后通过我之前创建的迭代器删除元素时,它抛出一个 ConcurrentModificationException

我一直在搜索 docs却找不到任何东西。

我明白为什么我会得到异常(它在文档中说明...),但是我如何使用 LinkedList 实现这一点?这显然是可能的。

编辑: 发表评论的人可能不了解双链表的工作原理,所以让我简要介绍一下。

双链表有对其上一个和下一个元素的引用,因此您可以删除它仅引用 O(1) 中的节点。

下一步,我要澄清我想要的行为:

  1. 向列表中添加一个元素。
  2. 保存对该节点的引用 r
  3. 添加另一个元素。
  4. 删除旧引用r

编辑#2: 我可以补充一点,C++ 可以毫无问题地做到这一点 (http://www.cplusplus.com/reference/list/list/)。

谢谢,

约翰

最佳答案

我认为这是不可能的,您应该使用 ConcurrentLinkedDeque。

JVM 已经过充分优化,不会对性能造成太大影响,它宣传的就是:

迭代器是弱一致性的,返回的元素反射(reflect)了双端队列在迭代器创建时或创建后的某个时刻的状态。它们不会抛出 ConcurrentModificationException,并且可能会与其他操作并发进行。

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedDeque.html

关于Java LinkedList 保留对节点的引用并添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33767805/

相关文章:

java - spring启动时好像找不到spring-beans-x.y.xsd

java - 紧密封装类

java - 在 Java 中使用按位 & 运算符和 + 给出不一致的结果

Java 无法在 OSX 上使用 JNI 加载共享对象库

java - 如何获取搜索结果中出现的术语集?

java - SAXBuilder 传递 HTTPS URL

java - @string 和@+string 的区别?

java - GWT 中的 hibernate 错误

java - Main.java:70:错误:预期为“.class”。 w

java - Object.wait() 超时