Java:在某处有另一种链表吗?

时间:2011-04-04 07:35:45

标签: java data-structures collections linked-list

是否有预先实现的链表可以用id而不是数组索引实现?

动机:我想在这里完成的是一个来自女巫细胞的链表可以通过parellel中的多个线程删除。 java的LinkedList的问题是引用是索引引用。

澄清一下:假设我有三个线程和三个单元格的LinkedList。第一个线程产生第一个单元格(或0但是无论如何......),......第三个线程产生第三个单元格。所以基本上线程产生的东西到它们作为缓冲区的单元格。现在,如果线程号2删除了第二个单元格(出于业务逻辑原因),则线程#3的引用变为#2。当然,如果线程#3仍在单元格#3上工作,则无法完成,因此需要同步,即使线程#3当前没有使用它的单元格,仍然需要告知线程它将使用单元格从现在开始#2。

解决方案:如果链接列表是使用id而不是数组索引引用实现的,则其他线程永远不会看到更改,即可以安全地删除单元格二,因为线程#3将使用它的单元格这样的东西linkedlist.add(id 3,C cell)而不是像这样添加(int index,C cell)。

我想这样的事情已经在某处实现了,但经过一段时间的谷歌搜索,我找不到它。所有帮助都得到了赞赏!

3 个答案:

答案 0 :(得分:3)

LinkedHashMap似乎相关,但我不确定它是否完全适合您的情况。试试吧。它是HashMap,因此您可以使用密钥访问项目。

答案 1 :(得分:2)

链接列表引用“下一步”,当“N”为大数时,使用链接列表中的索引可能会导致在索引“N”处访问项目时性能不佳。

为什么需要清单?是一个很大的问题的顺序?为什么你不能使用地图?

答案 2 :(得分:1)

只有两种方式可以按位置讨论传统的List元素。

  • 您可以通过索引引用列表元素;即,从第一个元素开始到达元素所需的步骤数。 (这就是List.get(int)的意思。)问题是元素的索引可能会因列表中的其他操作而发生变化。

  • 您可以使用Iterator作为游标来引用列表元素。某些其他操作可能会删除您正在查看的元素之前或之后的元素,但如果您使用适当的List实现,则不会影响当前元素。 (如果您使用非并发列表,则可能会获得ConcurrentModification个例外。)

最重要的是,如果您担心某些其他线程的更新导致索引更改,请不要使用索引。使用Iterator和支持并发修改的集合实现;例如CopyOnWriteArrayListConcurrentLinkedQueue或其中一个......具体取决于您要做的事情以及您需要的保证。


我不知道任何List实现允许您锁定更改元素位置的更新。 List API不支持这种事情。

此外:

  • 锁定像这样的列表可能是主要的并发瓶颈,
  • get(int)上使用set(int, Object)LinkedList无法扩展。