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的比较[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ArrayList 和 LinkedList的执行效率比较

ArrayList和LinkedList的区别

ArrayList和LinkedList的区别

ArrayList和LinkedList的区别

ArrayList和LinkedList的区别

ArrayList 和 LinkedList 比较