【问题标题】:ArrayList is faster than LInkedList in inserting and removing the elements at the middle according to this programArrayList 按照这个程序在中间插入和删除元素比 LInkedList 快
【发布时间】:2015-08-15 11:23:52
【问题描述】:

根据下面的程序,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 链表耗时:537

【问题讨论】:

  • Please provide me the proof of the fact that Insertion and deletion should be faster in LinkedList than ArrayList. 为什么你认为linkedlist 中的插入更快?
  • 您能否引用该文档的哪一部分说在中间插入linkedlistArraylist 快?

标签: java arraylist linked-list


【解决方案1】:

你这里有一个单独的案例。在这种情况下,您将在索引处添加和删除。链表实现不知道哪个项目在那个位置,所以它每次都必须在那里计数。这个操作会比较慢。

如果您有一个指向链表中某个项目的迭代器,那么此时的插入和删除会变得非常快,因为不会复制数组或扩大容器数组。这就是为什么链表更快的一般情况。

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

因此,链表并非普遍更快或更好,这就是我们仍然使用常规数组和列表的原因。它们在随机访问方面很慢,但在正确使用时会更快。

【讨论】:

  • @davmac 是的,就是这个词。谢谢
  • @SamiKuhmonen 谢谢。
  • @SamiKuhmonen 你能提供使用指针在 LinkedList 中添加元素的程序吗?统计数据也表明它比 ArrayList 更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 2011-05-03
  • 2012-08-17
  • 1970-01-01
  • 2013-10-17
  • 2013-03-23
相关资源
最近更新 更多