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

  • 相关阅读:
    分布式锁相关
    《并发编程的艺术》笔记
    JVM相关总结
    redisTemplate类学习及理解
    wondows 安装 OpenSSH
    centos系统下,mysql常用命令 vofill
    查看centos7服务器信息常用命令 vofill
    封装SQL2005数据库操作的Framework
    C# 获取到当前处于活跃状态的Excel对象(即已经打开的)c#获取打开的excel
    QML Qt Quick Study Note No.2
  • 原文地址:https://www.cnblogs.com/pzy4447/p/4892850.html
Copyright © 2020-2023  润新知