测试程序源代码如下:
public static void main(String[] args) {
Random rand=new Random();
ArrayList<String> arrayList = new ArrayList<String>();
LinkedList<String> linkedList = new LinkedList<String>();
long time1 = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
arrayList.add(new String("abc"));
}
long time2 = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
linkedList.add(new String("abc"));
}
long time3 = System.currentTimeMillis();
System.out.println("arrayList.insert_time = " + (time2 - time1));
System.out.println("linkedList.insert_time = " + (time3 - time2));
long time11 = System.currentTimeMillis();
for(int i = 0; i < 10000; i++) {
int random = rand.nextInt(10000);
String temp = arrayList.get(random);
}
long time12 = System.currentTimeMillis();
for(int i = 0; i < 10000; i++) {
int random = rand.nextInt(10000);
String temp = linkedList.get(random);
}
long time13 = System.currentTimeMillis();
System.out.println("arrayList.read_time = " + (time12 - time11));
System.out.println("linkedList.read_time = " + (time13 - time12));
long time111 = System.currentTimeMillis();
for(int i = 0; i < 10000; i++) {
int random = rand.nextInt(10000);
String temp = arrayList.remove(random);
}
long time112 = System.currentTimeMillis();
for(int i = 0; i < 10000; i++) {
int random = rand.nextInt(10000);
String temp = linkedList.remove(random);
}
long time113 = System.currentTimeMillis();
System.out.println("arrayList.remove_time = " + (time112 - time111));
System.out.println("linkedList.remove_time = " + (time113 - time112));
}
在如上代码中:
通过分别向ArrayList和LinkedList添加100000个String对象,通过比较所花费的时间对ArrayList和LinkedList的插入性能作比较。
通过Random生成随机数,随机访问ArrayList和LinkedList一共10000次,通过对比随机访问花费总时间分析ArrayList和LinkedList的随机访问性能。
通过Random生成随机数,随机删除ArrayList和LinkedList一共10000次,通过对比随机删除时间分析ArrayList和LinkedList的删除性能。
运行结果如下:
由上图可以看出,在插入性能上,ArrayList是LinkedList的5倍左右;
在随机读性能上,ArrayList性能是LinkedList的20倍左右;
在删除性能上,LinkedList是ArrayList的20倍左右。
从ArrayList和LinkedList源码分析来看,ArrayList内部采用数组保存元素,而LinkedList内部采用链表来保存元素。
在插入元素时,ArrayList可以直接通过下标访问,将元素放入到数组中;而LinkedList则需要new Node生成一个新节点,同时修改last尾部节点的指针,因此LinkedList要比ArrayList慢。
在随机访问时,ArrayList则根据下标直接访问数组元素,而LinkedList需要从头部开始遍历,因此ArrayList比LinkedList要快的多。
在删除方面,ArrayList在删除一个元素后,需要将该元素之后的所有元素往前移动;而LinkedList只需简单的修改指针即可,因此LinkedList比ArrayList更快。