1

我是 Java 新手。我试图将 LinkedList 元素的迭代器存储在 Map 中,稍后将其删除:

Map<Integer, Iterator<Integer>> map = new HashMap<>();
LinkedList<Integer> list = new LinkedList<>();
list.addFirst(1);
map.put(1, list.iterator());
list.addFirst(2);
map.put(2, list.iterator());

Iterator<Integer> iter = map.get(1);
iter.next();
iter.remove(); // list is supposed to be [2]

然而,ConcurrentModificationException发生。我认为只要在列表中添加“2”,“1”的迭代器就会过期,对吗?

在 C++ 中,list<int>::iterator表示链表中节点的指针,每当新节点插入链表时,该指针保持不变且可用。我在Java中对此有点困惑。


对困惑感到抱歉。现在我知道这Iterator通常用于迭代,而不是“定位”一个元素,这与 C++ 中的元素有点不同。

我实际上尝试保留链表中元素的引用,以便可以在O(1)而不是O(n)的复杂性中有效地访问元素。

是否有任何相关类型的 Collection 或 Util?DeLinkedList或者,也许我必须自己实施DeLinkedNode。提前致谢。

4

2 回答 2

0

如果你想要一个链表的排序和 O(1) 插入和删除,再加上哈希表的 O(1) 查找,LinkedHashSet可能是你最好的选择。

ALinkedHashSetSet保留插入顺序的 a。因此,您可以执行以下操作:

import java.util.LinkedHashSet;

...

LinkedHashSet<Integer> set = new LinkedHashSet();
set.add(2);
set.add(1);

set.remove(1);

几个警告:

  • 这是 a Set,因此您将不能保留一个元素的多个副本。
  • 没有addFirst等价物。项目总是添加到末尾。
于 2020-08-07T06:57:50.030 回答
0

而不是使用LinkedList,使用ConcurrentLinkedDeque。然后迭代器将按照您的希望工作。

如果您需要该List功能,而不仅仅是迭代器,您可以非常轻松地使用AbstractSequentialList该类List从您的ConcurrentLinkedDeque.

于 2020-08-07T08:17:32.023 回答