哪种数据结构?LinkedList还是Java中的任何其他应用程序?

哪种数据结构?LinkedList还是Java中的任何其他应用程序?,java,performance,optimization,data-structures,linked-list,Java,Performance,Optimization,Data Structures,Linked List,我对Java程序中使用的数据结构有特定的要求。它(数据结构)应该能够保存大量数据(不是固定的),我的主要操作是在末尾添加数据,从一开始就删除/读取数据(LinkedList看起来很好)。但偶尔,我也需要从中间删除,这也是LinkedList非常痛苦的地方。有人能给我建议一个解决这个问题的方法吗?或者通过任何优化,我可以在LinkedList中减少删除的痛苦 谢谢你的帮助 您可以尝试在每10000个元素之后使用带有指针的链表,这样可以减少查找要删除的中间元素的时间。 以下是链表的一些不同变体: L

我对Java程序中使用的数据结构有特定的要求。它(数据结构)应该能够保存大量数据(不是固定的),我的主要操作是在末尾添加数据,从一开始就删除/读取数据(LinkedList看起来很好)。但偶尔,我也需要从中间删除,这也是LinkedList非常痛苦的地方。有人能给我建议一个解决这个问题的方法吗?或者通过任何优化,我可以在LinkedList中减少删除的痛苦


谢谢你的帮助

您可以尝试在每10000个元素之后使用带有指针的链表,这样可以减少查找要删除的中间元素的时间。 以下是链表的一些不同变体:

LinkedList
在随机访问中失败。在没有随机访问查找的情况下,删除是一个固定的时间,因此对于长列表来说确实不太糟糕

ArrayList
通常速度很快。从中间插入和删除的速度比您预期的要快,因为块内存移动速度惊人。在起点附近的删除和插入会导致以下所有数据下移或上移

ArrayDeque
ArrayList
类似,只是它使用循环缓冲区,并且有一个奇怪的接口


常用建议:试试。

LinkedHashMap可能适合你的目的 你可以使用迭代器从前面提取内容 当需要访问列表中间部分时,按键查找条目可能是一种方法。非常适合迭代、deque操作和中间搜索。不过,由于您需要在基本收藏的基础上管理一组密钥,因此需要额外的内存成本。另外,我认为它会在您删除的空间中留下“间隙”,导致一组非连续的关键点(但不应影响迭代)


编辑:啊哈!我知道你需要什么:A!LinkedHashMap的所有优点,但没有多余的密钥集。不过,使用起来稍微复杂一点。

首先,您需要考虑是否从列表中心删除与列表长度相比。如果您的列表中有
N
项,但您删除的次数远远少于
1/N
,则不要担心。根据需要使用
LinkedList
ArrayDeque
。(如果您的列表有时很大,然后缩小,但大部分都很小,
LinkedList
会更好,因为它很容易恢复内存;否则,
ArrayDeque
不需要额外的对象,所以它会更快、更紧凑—除非底层数组从不缩小。)

另一方面,如果你删除的代码比 1 /N更频繁,那么你应该考虑一个<代码> LIKEDHASSET ,它在哈希集的顶部保持一个链表队列,但是它是一个集合,所以请记住,你不能存储重复的元素。这会带来

LinkedList
ArrayDeque
的开销,但如果您经常进行中心删除,这可能是值得的


然而,如果你真的需要每一分每一秒的速度,并且愿意花费编码时间来获得它,那么最佳结构将是一个具有循环缓冲区的“可调整大小”数组(即,当它太小时重新分配),你可以通过将元素设置为null从中间清空元素。(如果你有一个不正当的用例,你也可以在太多的缓冲区为空时重新分配缓冲区。)除非你真的喜欢编码高性能数据结构,或者有充分的证据证明这是代码中的关键瓶颈之一,因此你真的需要它,否则我不建议你编写这种代码。

思考skiplist?导致添加和删除为O(logn)是的,我研究了pugh等人的Skiplits,他们似乎是一个可行的解决方案