根据此程序,ArrayList在插入和删除中间元素时比LInkedList更快

时间:2015-08-15 11:23:52

标签: java arraylist linked-list

根据以下程序,ArrayList中的插入和删除比LinkedList快。请向我提供一个事实的证明,即LinkedList中的插入和删除应该比ArrayList更快。

public static void main(String args[]) {
    ArrayList al = new ArrayList();
    LinkedList ll = new LinkedList();
    int max_value = 10000000;

    // --------------------------------ArrayList-----------------------------------

    for (int i = 0; i <= max_value; i++) {
        ll.add(Integer.valueOf(i));
        al.add(Integer.valueOf(i));
    }

    int middle = max_value / 2;

    long d1 = System.currentTimeMillis();
    al.add(middle,Integer.valueOf(5));
    al.add(middle,Integer.valueOf(5));
    al.remove(middle);
    al.add(middle,Integer.valueOf(5));
    al.remove(middle);
    al.add(middle,Integer.valueOf(5));
    al.remove(middle);
    al.add(middle,Integer.valueOf(5));
    al.remove(middle);
    al.add(middle,Integer.valueOf(5));

    long d2 = System.currentTimeMillis();
    System.out.println("Time Taken in ArrayList:  " + (d2 - d1));

    // --------------------------------LinkedList-----------------------------------

    long d3 = System.currentTimeMillis();
    ll.add(middle,Integer.valueOf(5));
    ll.add(middle,Integer.valueOf(5));
    ll.remove(middle);
    ll.add(middle,Integer.valueOf(5));
    ll.remove(middle);
    ll.add(middle,Integer.valueOf(5));
    ll.remove(middle);
    ll.add(middle,Integer.valueOf(5));
    ll.remove(middle);
    ll.add(middle,Integer.valueOf(5));

    long d4 = System.currentTimeMillis();
    System.out.println("Time Taken in LinkedList:  " + (d4 - d3));

}

输出:

ArrayList中的时间:38 LinkedList中的时间:537

1 个答案:

答案 0 :(得分:5)

这里有一个案例。在这种情况下,您需要在索引处添加和删除。链表实现不知道哪个项位于该位置,因此每次都必须在那里计数。这个操作会慢一些。

如果你有一个链接列表中项目的迭代器,那么此时的插入和删除变得非常快,因为没有复制数组或放大容器数组。这是链接列表更快的一般情况。

此类行为的一个示例是当您迭代列表并需要根据某些条件删除项目时。然后,每次需要删除一个项目时,单个链接列表只会将前一个项目设置为指向已删除元素之后的元素并销毁已删除的元素。这是恒定时间操作。使用数组(列表),这将需要向后复制数组的其余部分,这是一个很慢的操作,取决于数组(列表)的位置和大小。

因此链接列表普遍更快或更好是不正确的,这就是我们仍然使用常规数组和列表的原因。它们随机访问速度慢,但正确使用时速度更快。