java中ArrayList和LinkedList的性能基准

java中ArrayList和LinkedList的性能基准,java,performance,arraylist,linked-list,Java,Performance,Arraylist,Linked List,读完这个[问题]:我试着对ArrayList和LinkedList的性能进行基准测试。但我发现结果与答案大不相同。就add而言,ArrayList的性能是LinkedList的2-3倍。 据我所知 LinkedList.addE元素为O1您感到困惑。在列表末尾添加元素是O1,这两个列表都是O1 ArrayList的唯一例外情况是达到列表容量时,这会强制ArrayList实例化一个新数组,并将所有元素从旧数组复制到新数组。但这种情况很少发生,因为每次完成时,容量都会乘以1.5 在这两种情况下,在列

读完这个[问题]:我试着对ArrayList和LinkedList的性能进行基准测试。但我发现结果与答案大不相同。就add而言,ArrayList的性能是LinkedList的2-3倍。 据我所知
LinkedList.addE元素为O1您感到困惑。在列表末尾添加元素是O1,这两个列表都是O1

ArrayList的唯一例外情况是达到列表容量时,这会强制ArrayList实例化一个新数组,并将所有元素从旧数组复制到新数组。但这种情况很少发生,因为每次完成时,容量都会乘以1.5

在这两种情况下,在列表中间添加元素。LinkedList必须从开始到结束进行迭代,直到找到必须插入新节点的位置。ArrayList必须将所有元素从插入索引移到末尾。

您只是在测试列表的append属性

ArrayList和LinkedList是列表的具体实现。在一天结束时,基准测试的目的是确定哪种列表更适合哪种情况。这就是为什么一个有效的基准会尝试测试这两个实现

请参见ArrayList末尾的插入是摊销O1。
 public static void main(String[] args) {
    long start = System.currentTimeMillis();
    List<Integer> b = new LinkedList<Integer>();
    for (int i = 0; i < 1000000; i++) {
        b.add(i);
    }
    System.out.println(System.currentTimeMillis() - start);

    start = System.currentTimeMillis();
    List<Integer> a = new ArrayList<Integer>();
    for (int i = 0; i < 1000000; i++) {
        a.add(i);
    }
    System.out.println(System.currentTimeMillis() - start);

}