Linkedlist与arraylist的比较[重复]
Posted
技术标签:
【中文标题】Linkedlist与arraylist的比较[重复]【英文标题】:comparison of Linkedlist over arraylist [duplicate] 【发布时间】:2014-12-31 10:53:20 【问题描述】:我了解到LinkedList
是作为双链表实现的。它在 add 和 remove 上的性能优于 Arraylist
,但在 get 和 set 方法上更差。
这是否意味着我应该选择LinkedList
而不是Arraylist
进行插入?
我写了一个小测试,发现ArrayList
插入速度更快。那么链表怎么比ArrayList
快呢?
请参考下面我做的例子。
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
public class TestLinkedList
public static void main(String[] args)
long lStartTime = new Date().getTime();
System.out.println("lStartTime:: " + lStartTime);
List<Integer> integerList = new LinkedList<Integer>();
for (int i = 0; i < 10000000; i++)
integerList.add(i);
long lEndTime = new Date().getTime();
System.out.println("lEndTime:: " + lEndTime);
long difference = lEndTime - lStartTime;
System.out.println("Elapsed milliseconds: " + difference);
【问题讨论】:
【参考方案1】:LinkedList
在插入时并不比ArrayList
快。 ArrayList
由数组支持,因此插入元素是微不足道的。插入LinkedList
需要创建一个新的Entry
实例,这比较慢。
插入到ArrayList
的唯一时间可能较慢是当插入导致ArrayList
容量增加时,这需要创建一个新数组并将旧数组复制到其中。
【讨论】:
插入数组是不重要的:如果您有 100 万个项目并在位置 500k 插入,那么您将需要复制 500k 个副本才能插入一个项目... @heorhi 我指的是在 ArrayList 末尾插入一个新条目。至于在中间插入,对于非常大的列表可能会更慢,但请记住它是通过 System.arraycopy 完成的。引用不是一一复制的。 @heorhi 另外请记住,在大型 LinkedList 中间插入也将比在末尾插入慢,因为它需要迭代链表(从头或尾) 直到到达新条目应在其后的条目。 你是对的。我同意差异不是那么显着,两种算法本质上都是线性的(LinkedList 必须线性搜索该项目)。【参考方案2】:Linkedlist 在插入时确实更快,问题出在您的示例上。在您的代码中,您始终通过附加到末尾来插入。对于 ArrayList,它与 LinkedList 一样简单。你应该做的是建立一个说 5000 个项目的列表,然后开始在中间插入。这里数组变得很慢 - 你必须在插入位置之后一直移动数组的其余部分。这将显示差异。分析事物的运作方式,不难理解为什么。这是修改后的代码:
import java.util.Date;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
public class Prob
public static void main(String[] args)
long lStartTime = new Date().getTime();
System.out.println("lStartTime:: " + lStartTime);
List<Integer> integerList = new LinkedList<Integer>();
for (int i = 0; i < 5000; i++)
integerList.add(0, i);
for (int i = 0; i < 100000; i++)
integerList.add(1000, i);
long lEndTime = new Date().getTime();
System.out.println("lEndTime:: " + lEndTime);
long difference = lEndTime - lStartTime;
System.out.println("Elapsed milliseconds: " + difference);
【讨论】:
以上是关于Linkedlist与arraylist的比较[重复]的主要内容,如果未能解决你的问题,请参考以下文章