【问题标题】:arraylist vs linked list .why linked list is slower when we add in the end?arraylist vs 链表。为什么最后添加时链表会变慢?
【发布时间】:2014-05-15 17:33:05
【问题描述】:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;


public class CompareList {
public static void main(String[] args) {
    List<Integer> ArrayList = new ArrayList<Integer>();
    List<Integer> LinkedList = new LinkedList<Integer>();
    doCalculations("ArrayList",ArrayList);
    doCalculations("LinkedList",LinkedList);    
}
private static void doCalculations(String type,List<Integer> List){
    for(int i=0;i<1E5;i++){
        List.add(i);    
    }
    Long start = System.currentTimeMillis();
    /*
     To add elements in the end 
    for(int i=0;i<1E5;i++){
        List.add(i);    
    }
    */
    for(int i=0;i<1E5;i++){
        List.add(0,i);
    }
    Long end = System.currentTimeMillis();
    System.out.println("time taken" +" "+ (end-start) + "ms for" +" "+ type);
}
}

ArrayList 耗时 13ms LinkedList 耗时 64ms

我知道这是重复的问题,但请不要删除它,无论他们对这个问题给出什么答案我都无法理解,谁能用简单的语言解释一下为什么当我们最后添加元素时这个链表会变慢?

【问题讨论】:

  • 因为基准测试很难。 stackoverflow.com/questions/504103/…
  • 抱歉,您的测试完全失败了。见stackoverflow.com/questions/504103/…
  • 尝试在你的main方法中反转doCalculations的调用,你会得到完全不同的结果;)
  • @LuiggiMendoza 你说的倒车是什么意思?
  • 先拨打doCalculations("LinkedList",LinkedList),然后拨打doCalculations("ArrayList",ArrayList);,你会看到的。

标签: java microbenchmark


【解决方案1】:

您目前在这里做的是一个微型基准测试。这不是一件容易的事,因为您必须考虑所有这些提示:How do I write a correct micro-benchmark in Java?

不过,没有必要重新发明轮子。有一些框架可以简化这项工作,例如 JUnitBenchmarksCaliper,它们可以帮助您使用 JUnit 测试为您的代码/算法执行真正的基准测试。

【讨论】:

    【解决方案2】:

    链表速度较慢,因为它就像一列火车......它必须检查每个元素并检查它的值......直到找到匹配的元素......所以把它想象成链式火车,你想从火车头到尾

    【讨论】:

    • 但是为什么它更快?
    猜你喜欢
    • 2015-04-10
    • 2017-01-15
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多