【问题标题】:comparison of Linkedlist over arraylist [duplicate]Linkedlist与arraylist的比较[重复]
【发布时间】: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);

        }

    }

【问题讨论】:

    标签: java list arraylist linked-list


    【解决方案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);
    
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-24
      • 2016-12-19
      • 2021-12-19
      • 2013-10-17
      • 2021-06-04
      • 2011-08-16
      • 2014-09-17
      • 1970-01-01
      相关资源
      最近更新 更多