从我们学习java的List时候就被灌输这样的一个概念:
ArrayList随机访问快;
LinkedList增删快;
然而事实真的是这样吗?请看以下代码:(任何人都能复制这份代码进行尝试)
package test;
import java.util.*;
public class ListTest{
private static int initsize=100000;//初始大小
private static int changesize=1000000;//变更大小
private static ArrayList<Integer> arrayList = new ArrayList<Integer>(initsize+changesize);
private static LinkedList<Integer> linkedList = new LinkedList<Integer>();
public static void main( String args[] ) {
Random r=new Random();
long startTime = 0;
long endTime = 0;
initElems();
int j = 0; while(j++ < 1) {
initElems();
startTime = System.currentTimeMillis();
for(int i = 0; i < changesize; i++) {
arrayList.add(i);//后方插入
// arrayList.add(0,i);//前方插入
// arrayList.add(r.nextInt(initsize+i),i);//随机插入
}
Collections.reverse(arrayList);//反转list
endTime = System.currentTimeMillis();
System.out.println("arrayList耗时:" + (endTime - startTime) + "ms");
startTime = System.currentTimeMillis();
for(int i = 0; i < changesize; i++) {
// linkedList.add(i);//后方插入
linkedList.add(0,i);//前方插入
// linkedList.add(r.nextInt(initsize+i),i);//随机插入
}
endTime = System.currentTimeMillis();
System.out.println("linkedList耗时:" + (endTime - startTime) + "ms");
System.out.println("");
}
}
/**
*各自填充初始化元素
*/
private static void initElems() {
arrayList.clear();
linkedList.clear();
for(int i = 0; i < initsize; i++ ) {
arrayList.add(i);
}
for(int i = 0; i < initsize; i++ ) {
linkedList.add(i);
}
}
}
先说结论:
1、在后方插入时,ArrayList和LinkedList数据量小时速度相差无几,数据量大了之后ArrayList完胜;
2、在前方插入时,LinkedList速度完爆ArrayList,充分体现了其优势;
3、在随机插入时,LinkedList又被ArrayList完爆了(出来混迟早要还的)
然而你以为这就完了?其实在前方插入时,ArrayList可以使用后方插入,最后再使用Collections.reverse()方法反转,速度依然完爆LinkedList。
至于原理分析,各位看官可以先自己想下,我们下期再带大家进行分析。(其实是要去吃饭啦^_^)