首页 > 其他 > 详细

ArrayList和LinkedList区别及性能测试

时间:2015-10-19 20:44:29      阅读:182      评论:0      收藏:0      [点我收藏+]

  ArrayListLinkedListJava Lis接口的2个实现。它们的区别如下表所示:

 

底层结构

强项

弱项

ArrayList

数组

随机访问get和set

插入删除

LinkedList

链表

插入删除

随机访问get和set

 

  那么它们在不同场景中的性能究竟有多大差别,我们来实测一下。

  测试环境:联想G50-70/INTEL CORE I7-4510U 双核4线程/WIN8.1 64bit

  测试程序:ListDemo.java

   

package Colloections;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class ListDemo {
/*
 * @author pzy
 * @function show the usage and performance of arrayList and linkedList
 * @version 2015-10-14
 */
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ListDemo listDemo = new ListDemo(); 
        //listDemo.basicOperationDemo();
        //listDemo.bulkOperationDemo();
        listDemo.LinkedListPerformanceTest(50000);
        listDemo.arrayListPerformanceTest(50000);
    }
    
    public void listPerformanceTest(List<Integer> list){
        int size = list.size();
        long startTime = System.currentTimeMillis();    
        for (int i = 0; i < size; i++) {
            list.get(i);
        }
        System.out.printf("%s: get element cost %d ms.%n", list.getClass().toString(), System.currentTimeMillis() - startTime);
        startTime = System.currentTimeMillis();
        for (int i = 0; i < size; i++) {
            list.add(size, i);//add a element at designated position
        }
        System.out.printf("%s: add element cost %d ms.%n",list.getClass().toString(),  System.currentTimeMillis() - startTime);
    }
    
    public void LinkedListPerformanceTest(int size){
        List<Integer> linkedList = new LinkedList<Integer>(createIntegerList(size));
        listPerformanceTest(linkedList);
    }
    
    public void arrayListPerformanceTest(int size){
        List<Integer> arrayList = new ArrayList<Integer>(createIntegerList(size));
        listPerformanceTest(arrayList);
    }
    
    
    public List<Integer> createIntegerList(int size){
        //construct a Integer list, but it is not a arrayList,is not allowed to add(),remove,etc
        Integer [] array = new Integer[size];
        for (int i = 0; i < size; i++) {
            array[i] = i;
        }
        return Arrays.asList(array);
    }
    
    public void basicOperationDemo(){
        int arrayLength = 10;
        //construct a list from array
        Integer [] array = new Integer[arrayLength];
        for (int i = 0; i < arrayLength; i++) {
            array[i] = i;
        }
        List<Integer> asList = Arrays.asList(array);
        //asList is not a arrayList,is not allowed to add(),remove,etc
        //construct a arrayList from asList,if you want a LinkedList, use new LinkedList<Integer>(asList);
        List<Integer> list = new ArrayList<Integer>(asList);

        System.out.printf("size() : %d%n", list.size());
        System.out.printf("toArray : %d%n", list.toArray().length);
        System.out.printf("contains(5) : %b%n", list.contains(5));
        System.out.printf("get(5) : %d%n", list.get(5));
        System.out.printf("size() : %d%n", list.size());
        System.out.printf("add(999) : %b%n", list.add(999));
        System.out.printf("indexOf(7) : %d%n", list.indexOf(7));
        System.out.printf("set(9, -9) : %d%n", list.set(9, -9));
        System.out.printf("isEmpty() : %b%n", list.isEmpty());
        System.out.printf("lastIndexOf(6) : %d%n", list.lastIndexOf(6));
        list.add(5, -5);
        System.out.printf("remove(8) : %d%n", list.remove(8));
        System.out.printf("remove(4) : %d%n", list.remove(4));
        System.out.printf("toString() : %s%n", list.toString());
    }
    
    private void bulkOperationDemo(){
         List<Integer> list20 = new ArrayList<Integer>(createIntegerList(20));
         List<Integer> list5 = new ArrayList<Integer>(createIntegerList(5));
         System.out.printf("containsAll(list5) : %b%n", list20.containsAll(list5));
         System.out.printf("size() : %d%n", list20.size());
         System.out.printf("removeAll(list5) : %b%n", list20.removeAll(list5));
         System.out.printf("size() : %d%n", list20.size());
         System.out.printf("addAll(list5) : %b%n", list20.addAll(list5));
         System.out.printf("size() : %d%n", list20.size());
         System.out.printf("retainAll(list5) : %b%n", list20.retainAll(list5));
         System.out.printf("size() : %d%n", list20.size());
         System.out.printf("toString() : %s%n", list20.toString());
         System.out.printf("=====================%n");
         List<Integer> subList = list5.subList(0, 3);
         System.out.printf("subList.toString() : %s%n", subList.toString());
         subList.add(30);
         System.out.printf("list5.toString() : %s%n", list5.toString());
         subList.clear();
         System.out.printf("list5.toString() : %s%n", list5.toString());
    }
}

 

  输出如下:

  class java.util.LinkedList: get element cost 936 ms.

  class java.util.LinkedList: add element cost 2244 ms.

  class java.util.ArrayList: get element cost 1 ms.

  class java.util.ArrayList: add element cost 186 ms.

 

咦,不是说LinkedList对于插入删除操作很快么,为什么测出来还要比arrayList慢那么多?

仔细看listPerformanceTest函数,我们将其中的add方法调用进行如下修改:

 

for (int i = 0; i < size; i++) {
            list.add(0, i);//add a element at designated position
        }

 

  输出如下:

  class java.util.LinkedList: get element cost 940 ms.

  class java.util.LinkedList: add element cost 5 ms.

  class java.util.ArrayList: get element cost 1 ms.

  class java.util.ArrayList: add element cost 641 ms.

  这个结果与表1就吻合了。测试结果表明,LinkedList进行add操作时,其性能与元素所在的位置有很大关系。由于链表无法进行随机访问,因此操作指定位置的元素时,都必须从首元素开始遍历,也就是说,如果指定元素的位置越靠后,则操作越耗时,越靠前则越省时。当然,remove操作也是一样的。因此,ArrayList与LinkedList的性能孰优孰劣不能一概而论,要视具体元素的分布而定。Java Tutorial原文写道:如果你决定使用LinkedList,在做决定之前请使用ArrayList和LinkedList分别测试你的应用程序,一般ArrayList要更快一些。

ArrayList和LinkedList区别及性能测试

原文:http://www.cnblogs.com/pzy4447/p/4892850.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!