为了弄清楚 LinkedList 与ArrayList的性能差异,特作了以下几组测试:
一 各插入一百万条数据:
以下是测试LinkedList:
import
java.util.LinkedList;
import utils.system;
public class Collection ... {
/** *//**
* TODO 描述方法的信息,详细说明方法的功能,列举输入参数、输出参数和返回值的含义
*
* @param args
*/
public static void main(String[] args) ...{
long st = System.currentTimeMillis();
LinkedList q=new LinkedList();
for(int i=0;i<1000000;i++)
...{
Integer I = new Integer(i);
q.add(I);
}
System.out.println(System.currentTimeMillis()-st);
}
}
import utils.system;
public class Collection ... {
/** *//**
* TODO 描述方法的信息,详细说明方法的功能,列举输入参数、输出参数和返回值的含义
*
* @param args
*/
public static void main(String[] args) ...{
long st = System.currentTimeMillis();
LinkedList q=new LinkedList();
for(int i=0;i<1000000;i++)
...{
Integer I = new Integer(i);
q.add(I);
}
System.out.println(System.currentTimeMillis()-st);
}
}
测试结果是 1562毫秒
接着测试 ArrayList
import
java.util.ArrayList;
/**/ /*
************************************************************
*本文件归属于西安协同时光软件有限公司,未经许可,不得擅自使用、拷贝和修改
*项目组:ESB小组
*版 本: SychroESB1.0
*日 期:2007-12-6
*时 间:下午01:59:33
*作 者:Administrator
***********************************************************
*/
/** */ /**
* TODO 此处描写类的详细信息和功能
*
* @author Administrator
* @since jdk1.6
*/
public class Collection2 ... {
/** *//**
* TODO 描述方法的信息,详细说明方法的功能,列举输入参数、输出参数和返回值的含义
*
* @param args
*/
public static void main(String[] args) ...{
long st = System.currentTimeMillis();
ArrayList q=new ArrayList();
for(int i=0;i<1000000;i++)
...{
Integer I = new Integer(i);
q.add(I);
}
System.out.println(System.currentTimeMillis()-st);
}
}
/**/ /*
************************************************************
*本文件归属于西安协同时光软件有限公司,未经许可,不得擅自使用、拷贝和修改
*项目组:ESB小组
*版 本: SychroESB1.0
*日 期:2007-12-6
*时 间:下午01:59:33
*作 者:Administrator
***********************************************************
*/
/** */ /**
* TODO 此处描写类的详细信息和功能
*
* @author Administrator
* @since jdk1.6
*/
public class Collection2 ... {
/** *//**
* TODO 描述方法的信息,详细说明方法的功能,列举输入参数、输出参数和返回值的含义
*
* @param args
*/
public static void main(String[] args) ...{
long st = System.currentTimeMillis();
ArrayList q=new ArrayList();
for(int i=0;i<1000000;i++)
...{
Integer I = new Integer(i);
q.add(I);
}
System.out.println(System.currentTimeMillis()-st);
}
}
测试结果是 812毫秒。
可见在插数据时 LinkedList 要快于 ArrayList。接下来测试删除数据的性能。
二:在用例一的基础上删除接近一百万条数据
以下是测试LinkedList:
import
java.util.LinkedList;
import utils.system;
public class Collection ... {
/** *//**
* TODO 描述方法的信息,详细说明方法的功能,列举输入参数、输出参数和返回值的含义
*
* @param args
*/
public static void main(String[] args) ...{
LinkedList q=new LinkedList();
for(int i=0;i<1000000;i++)
...{
Integer I = new Integer(i);
q.add(I);
}
long st = System.currentTimeMillis();
for(int i=0;i<1000000-10;i++)
...{
q.remove(10);
}
System.out.println(System.currentTimeMillis()-st);
}
}
import utils.system;
public class Collection ... {
/** *//**
* TODO 描述方法的信息,详细说明方法的功能,列举输入参数、输出参数和返回值的含义
*
* @param args
*/
public static void main(String[] args) ...{
LinkedList q=new LinkedList();
for(int i=0;i<1000000;i++)
...{
Integer I = new Integer(i);
q.add(I);
}
long st = System.currentTimeMillis();
for(int i=0;i<1000000-10;i++)
...{
q.remove(10);
}
System.out.println(System.currentTimeMillis()-st);
}
}
测试结果是 141毫秒。
接着测试 ArrayList
import
java.util.ArrayList;
/**/ /*
************************************************************
*本文件归属于西安协同时光软件有限公司,未经许可,不得擅自使用、拷贝和修改
*项目组:ESB小组
*版 本: SychroESB1.0
*日 期:2007-12-6
*时 间:下午01:59:33
*作 者:Administrator
***********************************************************
*/
/** */ /**
* TODO 此处描写类的详细信息和功能
*
* @author Administrator
* @since jdk1.6
*/
public class Collection2 ... {
/** *//**
* TODO 描述方法的信息,详细说明方法的功能,列举输入参数、输出参数和返回值的含义
*
* @param args
*/
public static void main(String[] args) ...{
ArrayList q=new ArrayList();
for(int i=0;i<1000000;i++)
...{
Integer I = new Integer(i);
q.add(I);
}
long st = System.currentTimeMillis();
for(int i=0;i<1000000-10;i++)
...{
q.remove(10);
}
System.out.println(System.currentTimeMillis()-st);
}
}
/**/ /*
************************************************************
*本文件归属于西安协同时光软件有限公司,未经许可,不得擅自使用、拷贝和修改
*项目组:ESB小组
*版 本: SychroESB1.0
*日 期:2007-12-6
*时 间:下午01:59:33
*作 者:Administrator
***********************************************************
*/
/** */ /**
* TODO 此处描写类的详细信息和功能
*
* @author Administrator
* @since jdk1.6
*/
public class Collection2 ... {
/** *//**
* TODO 描述方法的信息,详细说明方法的功能,列举输入参数、输出参数和返回值的含义
*
* @param args
*/
public static void main(String[] args) ...{
ArrayList q=new ArrayList();
for(int i=0;i<1000000;i++)
...{
Integer I = new Integer(i);
q.add(I);
}
long st = System.currentTimeMillis();
for(int i=0;i<1000000-10;i++)
...{
q.remove(10);
}
System.out.println(System.currentTimeMillis()-st);
}
}
测试结果令我们大吃一惊,竟然用了4087多秒。
那为什么会出现这样的情况呢?这就要求我们充分理解 LinkedList 与ArrayList。
LinkedList 是一个双向链表,一个元素有一个对他之前的元素的引用和一个对他之后的元素的引用,在插数据的时候必须对新的元素建立对之前和之后的元素的引用。而ArrayList只是一个数组,在插数据的时候只是将元素方在这个数组的最后,较LinkedList 应该是化的时间少一点,所以在插数据的时候ArrayList稍快于LinkedList 。LinkedList 在删除某个元素的时候,只是删除这个元素的对他之前和之后的元素的引用,而ArrayList由于是一个数组,如果这个要删除的元素不是位于最末端(我们上面的这个例子就是这种情况),那它必须将这个元素后面的每一个元素都往前移一个位置。这个开销是相当大的。所以会出现我们上面测试的那种结果。