ArrayList和LinkedList是Java 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要更快一些。

ArrayList和LinkedList区别及性能测试的更多相关文章

  1. String[]和ArrayList和LinkedList区别

    String[]和ArrayList和LinkedList区别 参考文档如下: http://www.blogjava.net/flysky19/articles/92775.html http:// ...

  2. 一、基础篇--1.2Java集合-Arraylist 与 LinkedList 区别

     Arraylist 与 LinkedList 区别  结构上的区别 ArrayList底层实现基于动态数组,LinkedList底层实现基于双向链表.  性能上区别 ArrayList查询快,增删慢 ...

  3. 1.ArrayList和LinkedList区别

    说⼀下ArrayList和LinkedList区别 具体区别 1.1. ⾸先,他们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现的 1.2. 由于底 ...

  4. Java中ArrayList和LinkedList区别

    ArrayList和LinkedList的大致区别如下:1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayLis ...

  5. 简谈ArrayList和LinkedList区别

    对于ArrayList和LinkedList,他们都实现了List接口,他们的区别大致为: ArrayList LinkedList (1)底层是数组,可以以O(1)的时间复杂度对元素进行随机访问 以 ...

  6. ArrayList和LinkedList区别

    一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问 ...

  7. Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度

    一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问 ...

  8. Java中ArrayList和LinkedList区别、ArrayList和Vector的区别

    一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,Ar ...

  9. ArrayList和LinkedList区别(蚂蚁金服面试题)

    1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全: 2. 底层数据结构: Arraylist 底层使用的是Object数组:LinkedLis ...

随机推荐

  1. C#多线程的用法4-线程间的协作lock快捷方式

    线程间协作还可通过lock(加锁)方式进行,lock属于C#的Monitor语法糖(Monitor后续讲解).使用简单快捷,如下: /// <summary> /// 多线程协作-lock ...

  2. MyBatis从入门到放弃六:延迟加载、一级缓存、二级缓存

    前言 使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载.一级缓存.二级缓存.使用时需要注意延迟加载必须使用resultMa ...

  3. Guava Cache源码解析

    概述: 本次主要是分析cache的源码,基本概念官方简介即可. 基本类图: 在官方的文档说明中,Guava Cache实现了三种加载缓存的方式: LoadingCache在构建缓存的时候,使用buil ...

  4. [undefined,1] 和 [,1]的区别在哪里--认识js中的稀疏数组

    事情是这样的 今天我想写一个能快速生成一个自然数数组的函数,就是[0,1,2,3]这样的,然后我写了下面的代码: new Array(10).map((item, index) => { ret ...

  5. struts2的java.lang.NoSuchMethodException异常处理(转)

    不久前在学习struts时出现这个错误,在网上搜索了半天,发现答案不一.将其总结如下,以方便大家参考. 1. 你有没有试试看 其它的方法能不能用,要是都是这种情况的话,可能是你的Action类没有继承 ...

  6. Python第一天---第一个Python程序

    1.我的环境是windows下,需要安装notepad++,安装Python2,配置环境变量(百度下可以见) 2.打开cmd窗口-----输入I:  [输入要在哪个磁盘存储python代码(我的在I: ...

  7. win7怎么更换锁屏壁纸

    win7怎么更换锁屏壁纸... -------------------------- 按键盘组合键“Windows+R”可打开“运行”窗口,输入 “gpedit.msc” 按回 ----------- ...

  8. vue-cli脚手架npm相关文件解读(1)webpack.base.conf.js

    系列文章传送门: 1.build/webpack.base.conf.js 2.build/webpack.prod.conf.js 3.build/webpack.dev.conf.js 4.bui ...

  9. WlMAP:突破内网端口转发映射工具

    使用说明 Wlmap包括服务端程序和客户端程序两部分 服务端程序Wlmaps一般架设到其它用户可以访问到的地方例如internet,它主要用来记录客户端信息以及端口映射信息,并且转发用户和客户端之间数 ...

  10. redis集群搭建及注意事项

    上一篇:redis的安装及注意事项 这里,在一个Linux虚拟机上搭建6个节点的redis伪集群,思路很简单,一台虚拟机上开启6个redis实例,每个redis实例有自己的端口.这样的话,相当于模拟出 ...