我尝试了以下测试数组和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));
}
}
答案 0 :(得分:0)
这不是一个公平的比较,因为在你添加int
(基本类型)的数组中,你在列表中隐式添加Integer
(对象),这是更重量级的。
公平的比较是Integer[]
而不是int[]
。自动装箱将负责转换,因此您需要更改以进行有效比较。可能打印操作毕竟需要对象,因此输出数组需要更多时间来创建对象,而列表在那时已经有了它们。