zoukankan      html  css  js  c++  java
  • ArrayList和LinkedList区别及性能测试

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

    底层结构

    强项

    弱项

    ArrayList

    数组

    随机访问get和set

    插入删除

    LinkedList

    链表

    插入删除

    随机访问get和set

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

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

      测试程序:ListPerformanceTest.java

       

    package Colloections;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.LinkedList;
    import java.util.List;
    
    public class ListPerformanceTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            ListPerformanceTest listPerformanceTest = new ListPerformanceTest(); 
            listPerformanceTest.LinkedListPerformanceTest(50000);
            listPerformanceTest.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);
        }
    }

      输出如下:

      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要更快一些。

  • 相关阅读:
    How to create jar for Android Library Project
    Very large tabs in eclipse panes on Ubuntu
    64bit Ubuntu, Android AAPT, R.java
    Linux(Ubuntu)下如何安装JDK
    Configure xterm Fonts and Colors for Your Eyeball
    建立、配置和使用Activity——启动其他Activity并返回结果
    建立、配置和使用Activity——使用Bundle在Activity之间交换数据
    建立、配置和使用Activity——启动、关闭Activity
    建立、配置和使用Activity——Activity
    异步任务(AsyncTask)
  • 原文地址:https://www.cnblogs.com/pzy4447/p/4892850.html
Copyright © 2011-2022 走看看