java - 哪种列表实现最适合从前面和后面删除和插入?

标签 java performance list data-structures

我正在研究一种算法,该算法将一小部分对象存储为较大对象集的子列表。对象本质上是有序的,因此需要一个有序列表。

最常执行的操作将按频率顺序排列:

  1. 从列表中检索第 n 个元素(对于任意 n)
  2. 在列表的开头或结尾插入一个
  3. 从列表中删除第一个或最后一个元素(对于某些 任意 n)

永远不会从中间删除和插入,因此无需考虑效率。

我的问题是,对于 Java 中的这个用例,List 的哪种实现最有效(即 LinkedList、ArrayList、Vector 等)?请通过解释不同数据结构的实现来捍卫您的答案,以便我做出明智的决定。

谢谢。

注意

不,这不是作业问题。不,我没有可以为我做这项工作的军队研究助理。

最佳答案

根据您的第一个标准(任意访问),您应该使用 ArrayList。 ArrayLists(和一般的数组)提供恒定时间的查找/检索。相反,在 LinkedList 中查找项目需要线性时间。

对于ArrayLists,末尾的插入或删除是自由的。它也可能与 LinkedLists 一起使用,但那将是特定于实现的优化(否则它是线性的)。

对于 ArrayLists,前面的插入或删除需要线性时间(随着空间的一致重用,这些可能会根据实现而变得不变)。列表前面的 LinkedList 操作是常量。

最后两个用例在某种程度上相互平衡,但最常见的用例肯定建议使用基于数组的存储。

至于基本的实现细节: ArrayLists 基本上只是内存的顺序部分。如果你知道起点在哪里,你可以只做一次加法来找到任何元素的位置。前端的操作成本很高,因为可能必须移动元素以腾出空间。

链表在内存中是不相交的,由相互链接的节点组成(引用第一个节点)。要找到第 n 个节点,您必须从第一个节点开始并跟随链接,直到到达所需的节点。前面的操作只需要创建一个节点并更新您的起始指针。

关于java - 哪种列表实现最适合从前面和后面删除和插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11547843/

相关文章:

r - 有条件和的组向量

performance - 带有 shouldComponentUpdate 的组件与无状态组件。表现?

C# 排序列表,逻辑比较

java - jquery 和 servlet 与 ajax 的通信

java - Android Studio 中的 JSON 项列表

java - Java中的动态多态性和静态多态性有什么区别?

java - JTable 不尊重单元格渲染器的必要高度

python - 与它们的等效函数相比,python 类慢了多少?

c - 将元素添加到有序列表的末尾

python - 如果后续列表包含相同元素,则删除所有先前列表