设置Arraylist的初始容量不是一个好主意?

时间:2018-06-05 11:21:42

标签: java performance arraylist linked-list

我是一名java开发人员已有三年但从未想过不同列表实现之间的基本性能成本。这就是我制作基准的原因:

private static int N = 10000000;
public static void main(String args[]){
    doSt(new ArrayList<String>());
    doSt(new ArrayList<String>(N));
    doSt(new LinkedList<String>());
}

private static List<String> doSt(List<String> fizzbuzz) {
    long l = System.currentTimeMillis();
    int counter = 1;
    while(counter <= N){
        fizzbuzz.add("aa");
        counter++;
    }
    long l2 = System.currentTimeMillis();
    System.out.println("time spent " + (l2-l));
}

我看到了

时间花了148,

时间花了33,

时间花了198,

意思是

时间性能(具有初始容量的ArrayList)&gt;时间表现(ArrayList)&gt;时间表现(LinkedList)。

LinkedList和ArrayList非常接近,因为在两个实现中插入都是O(1),我不会受到小差异的困扰。

但是,如果我更改实现,如:

private static int N = 10000000;
public static void main(String args[]){
    doStWithIfElse(new ArrayList<String>());
    doStWithIfElse(new ArrayList<String>(N));
    doStWithIfElse(new LinkedList<String>());
}

private static List<String> doStWithIfElse(List<String> fizzbuzz) {
    long l = System.currentTimeMillis();
    int counter = 1;
    while(counter <= N){
        if (counter %3 == 0 && counter %5 == 0){
            fizzbuzz.add("FizzBuzz");
        }
        else if (counter %3 == 0){
            fizzbuzz.add("Fizz");
        }
        else if (counter %5 == 0){
            fizzbuzz.add("Buzz");
        }
        else{
            fizzbuzz.add(Integer.toString(counter));
        }            counter++;
    }
    long l2 = System.currentTimeMillis();
    System.out.println("time spent " + (l2-l));
}

然后,

时间花了516,

花费8452的时间,

花费6808的时间,

然后突然之间,具有初始容量的ArrayList成为最差的执行者,没有初始容量的ArrayList以很大的优势击败它们。

这让我很困惑。当我引入if else语句时,性能变化的原因是什么?

0 个答案:

没有答案