When would you use a java.util.LinkedList
Possible Duplicate:
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 2
| List list = // choose your list here
list. add(0, new Object()); |
对于大名单来说,LinkedList将大大超过ArrayList的表现。同样适用于
…还有很多其他的方法。有关更多信息,我建议阅读有关java.util.Deque接口的内容,该接口也由LinkedList实现。
- list.remove()来自迭代器接口,此操作在ArrayList中的效率也相同。就list.add()而言,我同意在列表中的某个地方添加元素对于具有LinkedList的大型列表是有效的。
- @sachinrahulsourav:查看remove(int)的源代码。ArrayList执行对System.arraycopy的调用,而LinkedList只是更新一些引用…在接口中声明不会影响实现事实…除此之外,请注意,remove(int)不是在Iterator中声明的,而是在List中声明的。
- 你说得对。我刚刚意识到,remove()必须复制并更新引用
- 如果您要从列表的前面删除大量的插入操作,那么您可能需要ArrayDeque(或者反转列表)。
- @汤霍廷:说得好……
考虑这类数据结构上的3个常见运算符:随机元素访问、添加元素和删除元素。
在LinkedList中,您的随机元素访问很慢(o(n)),但是添加和删除很快(o(1)。对于arraylist,则相反:随机元素访问很快(o(n)),但添加和删除元素的速度较慢。
您需要了解您的系统将执行哪些操作,并使用适当的数据结构。
- 从何处插入或删除元素?可能是O(N)。
- @只有当您包括查找该元素的列表节点时,Tomhawtin才会处理。在某些情况下,您已经拥有它,或者可以在固定时间内获得它。在许多情况下,你必须搜索,无论如何,你必须搜索,即使你有一个数组。
LinkedList更适合(与ArrayList相比)插入/删除任意索引。当从ArrayList中插入或删除时,必须移动内部数组。对于LinkedList,这只是简单地重新调用节点指针的问题。
- 任意索引?O(n)。一般来说,只有ArrayList会更快。