Java Collections Framework(JCF) 是Java SE中一个基本的类集,几乎所有的项目都会用到,其中的List 则是JCF中最最常用的一个接口。围绕List 接口,有很多实现,诸如常用的ArrayList 、LinkedList 、VectorStack ,还有Java5之后引入的CopyOnWriteArrayList ,也有不少List 的开源实现,如Apache commons-collections中的各类List 。

  这么多的List 实现,如何选择?他们的运行效率具体怎样?本篇文章将用具体的代码来检测其中最最常用的一些List 实现。

测试环境: 
  处理器:Intel Core 2 Duo P8600 2.4GHz
  内存:2G
  硬盘:160G 7200rpm
  Java:SUN JDK 1.6.0_15
  开发环境:Eclipse 3.5
  第三方类库:Apache commons-lang 2.4、Apache commons-collections 3.2.1

主要测试对象: 
  java.util.ArrayList;
  java.util.LinkedList;
  java.util.Stack;
  java.util.Vector;
  java.util.concurrent.CopyOnWriteArrayList;
  org.apache.commons.collections.FastArrayList;
  org.apache.commons.collections.list.TreeList;

测试用例: 
  1.测试List 
   1.1顺序添加
   1.2随机插入
   1.3随机删除
   1.4随机访问
   1.5随机更新
   1.5顺序迭代
  2.测试List 在三种情况下的排序效率
   2.1初始时List 中元素已从小到大有序排列(最优情况)
   2.2初始时List 中元素已从大到小有序排列(最差情况)
   2.3初始时List 中元素随机排列,无序
  3.测试List 互相转换的效率
   3.1转化为TreeList 
   3.2转化为ArrayList 
   3.3转化为LinkedList 
   3.4转化为CopyOnWriteArrayList 
   3.5转化为Vector

测试代码:

package test;
import static java.lang.System.out;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
import java.util.Vector;
import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.commons.collections.FastArrayList;
import org.apache.commons.collections.list.TreeList;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.StopWatch;
@SuppressWarnings("unchecked")
public class ListPerformance {
public static void main(String[] args) {
ListPerformance test = new ListPerformance(10 * 10000);
out.print(StringUtils.center("Test List Performance: loop=" + test.loop, 80, '-'));
out.printf("/n%20s%10s%10s%10s%10s%10s%10s", "", "add", "insert", "remove", "get", "set",
"iterator");
test.benchmark(new FastArrayList());
test.benchmark(new TreeList());
test.benchmark(new ArrayList());
test.benchmark(new LinkedList());
test.benchmark(new CopyOnWriteArrayList());
test.benchmark(new Vector());
test.benchmark(new Stack());
//2.测试排序
out.print("/n/n");
out.print(StringUtils.center("Test List sort Performance: loop=" + test.loop, 80, '-'));
out.printf("/n%20s%10s%10s%10s", "", "optimize", "worst", "random");
test.benchmarkSort(new FastArrayList());
test.benchmarkSort(new TreeList());
test.benchmarkSort(new ArrayList());
test.benchmarkSort(new LinkedList());
//test.benchmarkSort(new CopyOnWriteArrayList());//UnsupportedOperationException
test.benchmarkSort(new Vector());
test.benchmarkSort(new Stack());
//3.测试各种数据结构间转化
out.print("/n/n");
out.print(StringUtils.center("Test List convert Performance: loop=" + test.loop, 80, '-'));
out.printf("/n%20s%10s%10s%10s%10s%10s", "", "Tree", "Array", "Linked", "CopyOnWrite",
"Vector");
test.benchmarkConvert(new FastArrayList());
test.benchmarkConvert(new TreeList());
test.benchmarkConvert(new ArrayList());
test.benchmarkConvert(new LinkedList());
test.benchmarkConvert(new CopyOnWriteArrayList());
}
/**测试循环次数*/
private int loop = 10000;
public ListPerformance(int loop) {
this.loop = loop;
}
public void benchmark(List list) {
out.printf("/n%20s", list.getClass().getSimpleName());
int j;
StopWatch watch = null;
//1.测试顺序性能(Add)
(watch = new StopWatch()).start();
for (int i = 0; i < loop; i++) {
list.add(new Integer(i));
}
watch.stop();
out.printf("%10d", watch.getTime());
//2.测试随机插入性能(Random insert)
(watch = new StopWatch()).start();
for (int i = 0; i < loop; i++) {
j = (int) (Math.random() * loop);
list.add(j, new Integer(-j));
}
watch.stop();
out.printf("%10d", watch.getTime());
//3.测试随机索引删除(Random remove)
(watch = new StopWatch()).start();
for (int i = 0; i < loop; i++) {
j = (int) (Math.random() * loop);
list.remove(j);
}
watch.stop();
out.printf("%10d", watch.getTime());
//4.测试随机取数性能(Random get)
(watch = new StopWatch()).start();
for (int i = 0; i < loop; i++) {
j = (int) (Math.random() * loop);
list.get(j);
}
watch.stop();
out.printf("%10d", watch.getTime());
//5.测试随机更新性能(Random set)
(watch = new StopWatch()).start();
for (int i = 0; i < loop; i++) {
j = (int) (Math.random() * loop);
list.set(j, j);
}
watch.stop();
out.printf("%10d", watch.getTime());
//6.测试迭代性能(Iterator)
(watch = new StopWatch()).start();
Iterator<Object> iter = list.iterator();
while (iter.hasNext()) {
iter.next();
}
watch.stop();
out.printf("%10d", watch.getTime());
}
public void benchmarkConvert(List list) {
out.printf("/n%20s", list.getClass().getSimpleName());
StopWatch watch = null;
//1.转TreeList
(watch = new StopWatch()).start();
new TreeList(list);
watch.stop();
out.printf("%10d", watch.getTime());
//2.转ArrayList
(watch = new StopWatch()).start();
new ArrayList(list);
watch.stop();
out.printf("%10d", watch.getTime());
//3.转LinkedList
(watch = new StopWatch()).start();
new LinkedList(list);
watch.stop();
out.printf("%10d", watch.getTime());
//4.转CopyOnWriteArrayList
(watch = new StopWatch()).start();
new CopyOnWriteArrayList(list);
watch.stop();
out.printf("%10d", watch.getTime());
//5.转Vector
(watch = new StopWatch()).start();
new Vector(list);
watch.stop();
out.printf("%10d", watch.getTime());
}
public void benchmarkSort(List list) {
out.printf("/n%20s", list.getClass().getSimpleName());
StopWatch watch = null;
//1.顺序List
for (int i = 0; i < loop; i++) {
list.add(new Integer(i));
}
(watch = new StopWatch()).start();
Collections.sort(list);
watch.stop();
out.printf("%10d", watch.getTime());
//2.逆序List
for (int i = loop - 1; i > 0; i--) {
list.add(new Integer(i));
}
(watch = new StopWatch()).start();
Collections.sort(list);
watch.stop();
out.printf("%10d", watch.getTime());
//3.随机顺序List
for (int i = 0, j = 0; i < loop; i++) {
j = (int) (Math.random() * loop);
list.add(new Integer(j));
}
(watch = new StopWatch()).start();
Collections.sort(list);
watch.stop();
out.printf("%10d", watch.getTime());
}
}

测试结果:

-----------------------Test List Performance: loop=100000-----------------------
add insert remove get set iterator
FastArrayList 16 8609 8360 15 47 0
TreeList 110 187 156 47 110 78
ArrayList 15 8313 8344 0 15 0
LinkedList 47 50110 80671 59016 55391 78
CopyOnWriteArrayList 54016 484003 370891 16 105406 0
Vector 15 8266 8328 0 16 0
Stack 31 8281 8266 0 16 0
--------------------Test List sort Performance: loop=100000---------------------

结论: 
  1.随机插入、随机删除操作中,用TreeList 效率最高;
  2.在只需要追加、迭代的环境下,LinkedList 效率最高;
  3.平均效率来讲,ArrayList 相对平衡,但如果海量随机操作,还是会造成性能瓶颈;
  4.CopyOnWriteArrayList 因为线程安全的原因,致使性能降低很多,所以慎用;
  5.Vector 没有传说中那么低的效率;
  6.让Stack 来做List 的事可以,不过语义上Stack 不应该做过多的List 的事情;
  7.在排序中,ArrayList 具有最好的性能,TreeList 平均性能也不错,LinkedList 的排序效率受元素初始状态的影响很大。
  8.各种List 间转换几乎没有时间损耗。
optimize worst random
FastArrayList 47 78 110
TreeList 15 47 110
ArrayList 32 47 78
LinkedList 15 109 125
Vector 0 63 94
Stack 16 46 78
-------------------Test List convert Performance: loop=100000-------------------
Tree Array LinkedCopyOnWrite Vector
FastArrayList 0 0 0 0 0
TreeList 0 0 0 0 0
ArrayList 0 0 0 0 0
LinkedList 0 0 0 0 0
CopyOnWriteArrayList 0 0 0 0 0

原文:http://blog.csdn.net/inkfish/article/details/5185320

Java中List效率的比较的更多相关文章

  1. Java中的IO操作和缓冲区

    目录 Java中的IO操作和缓冲区 一.简述 二.IO流的介绍 什么是流 输入输出流的作用范围 三.Java中的字节流和字符流 字节流 字符流 二者的联系 1.InputStreamReader 2. ...

  2. Java中迭代列表中数据时几种循环写法的效率比较

    Java中经常会用到迭代列表数据的情况,本文针对几种常用的写法进行效率比较.虽然网上已经有了类似的文章,但是对他们的结论并不认同. 常见的实现方法: 1.for循环: for(int i = 0; i ...

  3. Java中LinkedList的fori和foreach效率比较

    在<Java中ArrayList的fori和foreach效率比较>中对ArrayList的两种循环方式进行了比较,本次对LinkedList的两种遍历方式进行效率的比较. 1. list ...

  4. Java中AWT、Swing与SWT三大GUI技术的原理与效率差异

    Java中AWT.Swing与SWT三大GUI技术的原理与效率差异 转 https://blog.csdn.net/weixin_37703598/article/details/81843810   ...

  5. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  6. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  7. Java中的进程与线程(总结篇)

    详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...

  8. 多用多学之Java中的Set,List,Map

            很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...

  9. Java中堆内存和栈内存详解2

    Java中堆内存和栈内存详解   Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...

随机推荐

  1. 企业级Docker Registry —— Harbor搭建和使用

    本节内容: Harbor介绍 安装部署Harbor 环境要求 环境信息 安装部署harbor 配置harbor 配置存储 完成安装和启动harbor 访问Harbor 修改管理员密码 启动后相关容器 ...

  2. Ocelot 配置初始

    { "ReRoutes": [ { /*将用户的请求 /post/1 转发到 localhost/api/post/1*/ /* DownstreamPathTemplate:转到 ...

  3. CF 586A 找1的个数和101的个数

    Sample test(s) input 50 1 0 1 1 output 4 input 71 0 1 0 0 1 0 output 4 input 10 output 0 # include & ...

  4. MVC文件上传

    这次来看下一个MVC网站上传文件的功能,其中上传用到uploadify这个jquery插件,网上还有很多类似的,哪种都无所谓,能实现功能便行,貌似uploadify官网上的这个插件是要付费的,这里就顺 ...

  5. 【洛谷】P2179 [NOI2012]骑行川藏

    题解 感谢小迪给我讲题啊,这题小迪写挺好的我就不写了吧 小迪的题解 代码 #include <iostream> #include <cstdio> #include < ...

  6. 远程连接mysql root账号报错:2003-can't connect to MYSQL serve(转)

    远程连接mysql root账号报错:2003-can't connect to MYSQL serve 1.远程连接Linux系统,登录数据库:mysql -uroot -p(密码) 2.修改roo ...

  7. Python之路【第十篇】: python基础之socket编程

    阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 recv与 ...

  8. Flutter的原理及美团的实践

    导读 Flutter是Google开发的一套全新的跨平台.开源UI框架,支持iOS.Android系统开发,并且是未来新操作系统Fuchsia的默认开发套件.自从2017年5月发布第一个版本以来,目前 ...

  9. centOS7.4服务器 yum安装 搭建lamp环境

    // 红色加粗是linux命令 安装gcc和gcc-c++ yum -y install gcc gcc-c++ yum list httpd* 安装apche yum -y install http ...

  10. [LearnOpenGL]照相机的变换、坐标系、摄像机

    前言 跟着LearnOpenGL上学着做项目,的确对于知识掌握得更清晰一些了. 第一个项目 第一个项目,是关于简单的熟悉矩阵变换的,创建了10个立方体,代码如下. // 视图矩阵,看作是一个照相机 g ...