关于Java:Linkedlist vs ArrayList比较

comparison of Linkedlist over arraylist

本问题已经有最佳答案,请猛点这里访问。

我知道LinkedList是作为一个双链表实现的。它在添加和删除方面的性能优于Arraylist,但在get和set方法上的性能较差。

这是否意味着我应该选择LinkedList而不是Arraylist来插入?

我写了一个小测试,发现Arraylist插入速度更快。那么链表怎么比Arraylist快呢?

请参考下面我已经做过的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    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);

        }

    }


LinkedList插入不快于ArrayListArrayList由数组支持,因此插入元素非常简单。插入到LinkedList中需要创建一个新的Entry实例,这个实例比较慢。

插入到ArrayList的唯一时间可能会慢一些,因为插入会增加ArrayList的容量,这需要创建一个新的数组并将旧数组复制到它。


LinkedList的插入速度确实更快,问题在于您的示例。在您的代码中,您可以通过一直附加到结尾来插入。对于ArrayList,它和LinkedList一样简单。你应该做的是列出5000个项目,然后开始在中间插入。在这里,数组变慢了——在插入位置之后,您必须一直移动数组的其余部分。这就是将显示差异的原因。分析事物是如何工作的,不难理解为什么。以下是修改后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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);

        }
}