博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArrayList和LinkedList区别及性能测试
阅读量:7199 次
发布时间:2019-06-29

本文共 3017 字,大约阅读时间需要 10 分钟。

  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
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
linkedList = new LinkedList
(createIntegerList(size)); listPerformanceTest(linkedList); } public void arrayListPerformanceTest(int size){ List
arrayList = new ArrayList
(createIntegerList(size)); listPerformanceTest(arrayList); } public List
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的性能孰优孰劣不能一概而论,要视具体元素的分布而定。原文写道:如果你决定使用LinkedList,在做决定之前请使用ArrayList和LinkedList分别测试你的应用程序,一般ArrayList要更快一些。

转载于:https://www.cnblogs.com/pzy4447/p/4892850.html

你可能感兴趣的文章
Windows 7的开机
查看>>
密码破解之Esxi重置root密码
查看>>
js判断undefined类型
查看>>
Spring源码-IOC容器(四)-FactoryBean
查看>>
PHP无限递归菜单的实现流程
查看>>
马哥培训的第一次作业
查看>>
Django学习笔记(一)
查看>>
查询表占用空间大小
查看>>
初入安卓系统感觉一片茫然
查看>>
linux用户和组笔记(个人整理)
查看>>
删除citeulike导出的bib文件中的中文字符,使之能在WinEdt中读取
查看>>
定时器/计数器的提高实验报告
查看>>
我的友情链接
查看>>
Terminate Instance 操作详解 - 每天5分钟玩转 OpenStack(33)
查看>>
我的友情链接
查看>>
服务器磁盘lvm管理轻松在线扩容
查看>>
Math
查看>>
微信上传图文素材错误 40007
查看>>
java.security.InvalidKeyException: IOException : Detect premature EOF
查看>>
我的友情链接
查看>>