你啥时候使用 java.util.LinkedList [重复]

Posted

技术标签:

【中文标题】你啥时候使用 java.util.LinkedList [重复]【英文标题】:When would you use a java.util.LinkedList [duplicate]你什么时候使用 java.util.LinkedList [重复] 【发布时间】:2012-04-04 05:08:22 【问题描述】:

可能重复:When to use LinkedList<> over ArrayList<>?

这是一次真正的尝试,了解人们何时会使用 LinkedList;

据我了解,由于 java.util.LinkedList 不支持随机访问,因此获取第 n 个元素的唯一方法是从 1 跳到 (n-1) 或使用 get(n) 本身非常效率低下。 那么为什么要使用 LinkedList 呢?除非您想使用 ListIterator 从双方迭代集合,否则 ArrayList 将在大多数情况下发挥作用?

【问题讨论】:

获取第 n 个元素听起来像是随机访问。 @Steve Kuo,LinkedList 不允许随机访问。您可以执行 get(n),但该方法本身的实现从从 1 跳到 (n-1) 开始。所以它不是随机访问 【参考方案1】:

想想这个方法:

List list = // choose your list here
list.add(0, new Object());

对于大型列表,LinkedList 的性能将大大优于 ArrayList。这同样适用于

list.remove(0);

... 和许多其他方法。有关更多信息,我建议阅读java.util.Deque 接口,该接口也是由LinkedList 实现的

【讨论】:

list.remove() 来自 Iterator 接口,此操作在 ArrayList 中也将具有相同的效率。至于 list.add() 我同意在列表中的某处添加一个元素对于具有 LinkedList 的大型列表是有效的。 @sachinrahulsourav:查看remove(int)的源代码。 ArrayList 执行对 System.arraycopy 的调用,而 LinkedList 只是更新一些引用...在接口中声明不会影响实现事实...除此之外,请注意 remove(int) 未在 @ 中声明987654333@,但在List... 你说得对。我刚刚意识到,remove() 必须复制并更新引用 如果您要从列表的前面删除大量插入,也许您想要ArrayDeque(或反转列表)。【参考方案2】:

考虑这些数据结构的 3 个常见运算符:随机元素访问、添加元素和删除元素。

在 LinkedList 中,您的随机元素访问速度很慢(O(N)),但添加和删除速度很快(O(1)。对于 ArrayList,情况正好相反:随机元素访问速度很快(O(N)) ,但添加和删除元素的速度较慢。

您需要查看您的系统将执行哪些操作并使用适当的数据结构。

【讨论】:

从哪里插入或删除一个元素?可能是 O(n)。 @TomHawtin-tackline 仅当您包含查找该元素的列表节点时。在某些情况下,您已经拥有它,或者可以在恒定时间内获得它。在许多必须搜索的情况下,无论如何你都必须搜索,即使你有一个数组。【参考方案3】:

LinkedList 更适合(与ArrayList 相比)用于任意索引的插入/删除。在ArrayList 中插入或删除时,必须移动内部数组。对于LinkedList,只需重新指向节点的指针即可。

【讨论】:

任意索引?两者都是 O(n)。只有ArrayList 通常会更快。

以上是关于你啥时候使用 java.util.LinkedList [重复]的主要内容,如果未能解决你的问题,请参考以下文章

你啥时候使用 Java 的 @Override 注解,为啥?

你啥时候使用“this”关键字? [关闭]

你啥时候在流中使用接口而不是类型别名?

你啥时候会使用不同的 git 合并策略?

你啥时候在 Java 中使用 volatile 关键字? [复制]

你啥时候以及为啥要封课?