Array Vs ArrayList性能测试,同时添加和访问元素

时间:2014-11-30 10:50:37

标签: java arrays performance arraylist

我尝试了以下测试数组和ArrayList的性能。我知道arrayList是由数组备份的,但我在从列表和数组访问数据时看到了奇怪的行为,如下所述。 我想了解为什么会出现这种行为?没有创建具有初始容量的ArrayList可以提高性能,还是我在做任何错误?添加元素时,我没有发现任何性能改进。

以下程序的输出如下:

time taken to add elements 1
time taken to print elements 229
LIST: time taken to add elements 10 // it is same even i set the initial capacity by passing as arg to constructor.
LIST: time taken to print elements 161

我已将print语句省略为占用空间。

我看,它是一个重复的帖子,然而,发布时它会在检索时给出不同的行为。

package com.samples.misc;

import java.util.ArrayList;
import java.util.List;

public class ArrayTest {

    public static void main(String[] args) {

        long startTime = System.currentTimeMillis();
        int a[] = new int[50000];
        for(int i=0;i<a.length;i++)
            a[i] = i;
        long endTime = System.currentTimeMillis();
        System.out.print("time taken to add elements "+(endTime - startTime));
        System.out.println();

        startTime = System.currentTimeMillis();
        for(int i=0;i<a.length;i++)
            System.out.print(a[i]);
        endTime = System.currentTimeMillis();
        System.out.println();
        System.out.println("time taken to print elements "+(endTime - startTime));
        System.out.println();

        startTime = System.currentTimeMillis();
        List<Integer> integers = new ArrayList<Integer>(); 
        //List<Integer> integers = new ArrayList<Integer>(50000); this does not make any diff, it takes same amount of time to add elements, whats the use case of this?
        for(int i=0;i<50000;i++){
            integers.add(i);
        }
        endTime = System.currentTimeMillis();
        System.out.println("LIST: time taken to add elements "+(endTime - startTime));
        System.out.println();

        startTime = System.currentTimeMillis();
        for(int i=0;i<a.length;i++)
            System.out.print(integers.get(i));
        endTime = System.currentTimeMillis();
        System.out.println();
        System.out.println("LIST: time taken to print elements "+(endTime - startTime));
    }
}

1 个答案:

答案 0 :(得分:0)

这不是一个公平的比较,因为在你添加int(基本类型)的数组中,你在列表中隐式添加Integer(对象),这是更重量级的。 公平的比较是Integer[]而不是int[]。自动装箱将负责转换,因此您需要更改以进行有效比较。可能打印操作毕竟需要对象,因此输出数组需要更多时间来创建对象,而列表在那时已经有了它们。