java数组结构和链表结构效率比较

以前在网上和书上看到关于数组和链表结构效率比较的文字比较多,虽然明白原理.但一直都没有自己亲自试验过.今天我测试比较一下两者,按照两者的数据模型来说,链表结构是不连续的内存单元组成,数组结构是连续的内存单元,这点决定了数组访问速度比链表访问速度快,而链表删除元素要比数组快

随机访问:

 

public class RandomAccess {
public static void main(String[] args) {
    long[] timeBegin = new long[2]; //记录开始时间的数组
    long[] timeEnd = new long[2];//记录结束时间的数组
    Integer[] ia = new Integer[5000];//创建一个Integer对象的数组
    for(int i=0;i<5000;i++){
        ia[i] = i;//为Integer对象数组的每个元素复制
    }
    int tempi;
    Random r = new Random();
    //对ArrayList进行访问
    List list = new ArrayList(Arrays.asList(ia));//创建ArrayList对象
    timeBegin[0] = System.currentTimeMillis();
    for(int i=0;i<100000;i++){
        tempi = (Integer)list.get(r.nextInt(5000));//随机进行10000次访问
    }
    timeEnd[0]=System.currentTimeMillis();
    //对LinkedList进行访问
    list = new LinkedList(Arrays.asList(ia));//创建LinkedList数组
    timeBegin[1] = System.currentTimeMillis();
    for(int i=0;i<100000;i++){
        tempi = (Integer)list.get(r.nextInt(5000));//随机进行100000次访问
    }
    timeEnd[1]=System.currentTimeMillis();
    //打印输出比较结果
    System.out.println(" ArrayList[5000]10000次随机访问耗时:"+(timeEnd[0]-timeBegin[0])+"(ms)");
    System.out.println("LinkedList[5000]10000次随机访问耗时:"+(timeEnd[1]-timeBegin[1])+"(ms)");
    /*
     ArrayList[5000]10000次随机访问耗时:11(ms)
    LinkedList[5000]10000次随机访问耗时:349(ms)
    */
}

}

顺序新增

 

public class OrderAdd {

    public static void main(String[] args) {
        long[] timeBegin = new long[2]; //记录开始时间的数组
        long[] timeEnd = new long[2];//记录结束时间的数组
        Random r = new Random();
        //对ArrayList进行访问
        List list = new ArrayList();//创建ArrayList对象
        timeBegin[0] = System.currentTimeMillis();
        for(int i=0;i<100000;i++){
            list.add(r.nextInt(5000));
        }
        timeEnd[0]=System.currentTimeMillis();
        //对LinkedList进行访问
        list = new LinkedList();//创建LinkedList数组
        timeBegin[1] = System.currentTimeMillis();
        for(int i=0;i<100000;i++){
            list.add(r.nextInt(5000));
        }
        timeEnd[1]=System.currentTimeMillis();
        //打印输出比较结果
        System.out.println(" ArrayList[100000]顺序新增耗时:"+(timeEnd[0]-timeBegin[0])+"(ms)");
        System.out.println("LinkedList[100000]顺序新增耗时:"+(timeEnd[1]-timeBegin[1])+"(ms)");
        /*
        ArrayList[100000]顺序新增耗时:31(ms)
        LinkedList[100000]顺序新增耗时:48(ms)
        */
    }

}

顺序删除

public class OrderRemove {

    public static void main(String[] args) {
        long[] timeBegin = new long[2]; //记录开始时间的数组
        long[] timeEnd = new long[2];//记录结束时间的数组
        Integer[] ia = new Integer[100000];//创建一个Integer对象的数组
        for(int i=0;i<100000;i++){
            ia[i] = i;//为Integer对象数组的每个元素复制
        }
        //对ArrayList进行访问
        List list = new ArrayList(Arrays.asList(ia));//创建ArrayList对象
        timeBegin[0] = System.currentTimeMillis();
        for(int i=0;i<100000;i++){
            list.remove(0);
        }
        timeEnd[0]=System.currentTimeMillis();
        //对LinkedList进行访问
        list = new LinkedList(Arrays.asList(ia));//创建LinkedList数组
        timeBegin[1] = System.currentTimeMillis();
        for(int i=0;i<100000;i++){
            list.remove(0);
        }
        timeEnd[1]=System.currentTimeMillis();
        //打印输出比较结果
        System.out.println(" ArrayList[100000]顺序删除耗时:"+(timeEnd[0]-timeBegin[0])+"(ms)");
        System.out.println("LinkedList[100000]顺序删除耗时:"+(timeEnd[1]-timeBegin[1])+"(ms)");
        /*
          ArrayList[100000]顺序删除耗时:5317(ms)
          LinkedList[100000]顺序删除耗时:6(ms)
         */
    }

}

逆序删除

public class ReverseOrderRemove {

    public static void main(String[] args) {
        long[] timeBegin = new long[2]; //记录开始时间的数组
        long[] timeEnd = new long[2];//记录结束时间的数组
        Integer[] ia = new Integer[100000];//创建一个Integer对象的数组
        for(int i=0;i<100000;i++){
            ia[i] = i;//为Integer对象数组的每个元素复制
        }
        //对ArrayList进行访问
        List list = new ArrayList(Arrays.asList(ia));//创建ArrayList对象
        timeBegin[0] = System.currentTimeMillis();
        for(int i=0;i<100000;i++){
            list.remove(100000-i-1);
        }
        timeEnd[0]=System.currentTimeMillis();
        //对LinkedList进行访问
        list = new LinkedList(Arrays.asList(ia));//创建LinkedList数组
        timeBegin[1] = System.currentTimeMillis();
        for(int i=0;i<100000;i++){
            list.remove(100000-i-1);
        }
        timeEnd[1]=System.currentTimeMillis();
        //打印输出比较结果
        System.out.println(" ArrayList[100000]逆序删除耗时:"+(timeEnd[0]-timeBegin[0])+"(ms)");
        System.out.println("LinkedList[100000]逆序删除耗时:"+(timeEnd[1]-timeBegin[1])+"(ms)");
        /*
        ArrayList[100000]逆序删除耗时:3(ms)
        LinkedList[100000]逆序删除耗时:4(ms)
        */
    }

}

你可能感兴趣的:(java,链表,数组)