我是一名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语句时,性能变化的原因是什么?