ArrayList与LinkedList的性能因机器而异?

时间:2013-11-20 17:02:54

标签: java performance data-structures collections arraylist

实际上,我已经尝试了this link相关的Arraylist与LinkList相关的示例。但是我的问题是不同机器的性能不同,在我从stackoverflow中读出一个问题之前就是这样。

Performance differences between ArrayList and LinkedList

           package com.demo.collections;
           import java.util.ArrayList;
           import java.util.LinkedList;
           public class ArraylistAndLinklist {
           public static void main(String args[]){
            ArrayList arrayList = new ArrayList();
            LinkedList linkedList = new LinkedList();
            // ArrayList add
            long startTime = System.nanoTime();
            for (int i = 0; i < 100000; i++) {
            arrayList.add(i);
            }
            long endTime = System.nanoTime();
            long duration = endTime - startTime;
            System.out.println("ArrayList add:  " + duration);
            // LinkedList add
            startTime = System.nanoTime();
            for (int j = 0; j < 100000; j++) {
            linkedList.add(j);
            }
            endTime = System.nanoTime();
            duration = endTime - startTime;
            System.out.println("LinkedList add: " + duration);
            // ArrayList get
            startTime = System.nanoTime();
            for (int k = 0; k < 10000; k++) {
            arrayList.get(k);
            }
            endTime = System.nanoTime();
            duration = endTime - startTime;
            System.out.println("ArrayList get:  " + duration);
               // LinkedList get
                startTime = System.nanoTime();
                for (int l = 0; l < 10000; l++) {
                linkedList.get(l);
                }
               endTime = System.nanoTime();
                 duration = endTime - startTime;
                 System.out.println("LinkedList get: " + duration);
                // ArrayList remove
               startTime = System.nanoTime();
                for (int m = 9999; m >=0; m--) {
                arrayList.remove(m);
                 }
                endTime = System.nanoTime();
                duration = endTime - startTime;
                 System.out.println("ArrayList remove:  " + duration);
                // LinkedList remove
                startTime = System.nanoTime();
                 for (int n = 9999; n >=0; n--) {
                 linkedList.remove(n);
                 }
                endTime = System.nanoTime();
                duration = endTime - startTime;
                System.out.println("LinkedList remove: " + duration);
            }

1st.machine输出:

ArrayList add:  24675693
LinkedList add: 15693734
ArrayList get:  3464166
LinkedList get: 131314610
ArrayList remove:  344500934
LinkedList remove: 127862009

第二。机器输出:

ArrayList add: 13265642
LinkedList add: 9550057.
ArrayList get: 1543352
LinkedList get: 85085551
ArrayList remove: 199961301
LinkedList remove: 85768810

有人可以告诉我:

我有一些问题

1.为什么不同机器的性能会有所不同?

2.为什么arraylist添加和删除比linklist慢?

3.为什么Arraylist变得更快?

4.在哪种情况下,应该更喜欢链接列表?

2 个答案:

答案 0 :(得分:3)

1.为什么不同机器的性能会有所不同?

这可能是由许多因素造成的。对于此示例,RAM的速度可能是最大的贡献者,但CPU速度,系统负载等都可以影响性能。这种类型的差异是好的和预期的。

2.为什么arraylist添加和删除比linklist慢?

在这个庞大的数据集中,数组列表将间歇性地耗尽数组中的空间,它在内部保存数据。发生这种情况时,数组将需要调整大小,这意味着创建一个新的更大的数组并复制所有数据(非平凡的任务)。删除可能需要移动数组中的后续元素。这是类似的。

3.为什么Arraylist变得更快?

Arraylist get可以在O(1)时间(恒定时间)内完成,因为它只是内部数组中的偏移内存查找。但是,链接列表必须遍历列表才能找到该元素。这需要O(n)时间(线性时间)。

4.在哪种情况下,应该更喜欢链接列表?

如果您执行的插入/删除操作多于查找,则链接列表的性能可能优于arraylist。相反,如果您正在进行更多的查找操作,那么arraylist可能会为您提供更好的性能。

答案 1 :(得分:0)

  1. 因为ram(大多数情况下)或jvm,OS等的速度

  2. 因为有时数组不长,有时它很大 - &gt;调整大小需要很多时间

  3. 因为您可以在O(1)时间内获取数据,并且对于您的链表,您的get实现很糟糕(您遍历所有节点直到第j个节点)。通常你在O(1)的链表中得到你的迭代数据,但你有O(n)

  4. 对于大数据,因为你不必找到一块足够大的数据块。链表可以通过ram

  5. 拆分数据

    它帮助我自己编写一个链表和一个arraylist来更好地理解它们