你啥时候使用 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 注解,为啥?