Java数组和各种List的性能比较
以下程序分别对Java数组、ArrayList、LinkedList和Vector进行随机访问和迭代等操作,并比较这种集合的性能。
package cn.lion.test;
public class PerformanceTest { privatestatic final int SIZE =100000;
publicstatic abstract class Test{
privateString operation;
publicTest(String operation){
this.operation= operation;
}
publicabstract void test(List<String> list);
publicString getOperation(){
returnoperation;
}
}
//执行迭代操作的匿名类
staticTest iterateTest = new Test("iterate"){
publicvoid test(List<String> list){
for(inti=0; i<10; i++){
Iterator<String>it = list.iterator();
while(it.hasNext()){
it.next();
}
}
}
};
//执行随机访问的匿名类
staticTest getTest = new Test("get"){
publicvoid test(List<String> list){
for(inti=0; i<list.size(); i++){
for(intk=0; k<10; k++){
list.get(k);
}
}
}
};
//执行插入的匿名类
staticTest insertTest = new Test("insert"){
publicvoid test(List<String> list){
ListIterator<String>it = list.listIterator(list.size()/2);
for(inti=0; i<SIZE; i++){
it.add("lion");
}
}
};
//执行删除的匿名类
staticTest removeTest = new Test("remove"){
publicvoid test(List<String> list){
ListIterator<String>it = list.listIterator();
while(it.hasNext()){
it.next();
it.remove();
}
}
};
staticpublic void testArray(List<String> list){
Test[]tests = {iterateTest, getTest};
test(tests,list);
}
staticpublic void testList(List<String> list){
Test[]tests = {insertTest, iterateTest, getTest, removeTest};
test(tests,list);
}
staticpublic void test(Test[] tests, List<String> list){
for(inti=0; i<tests.length; i++){
System.out.print(tests[i].getOperation()+ "操作:");
longt1 = System.currentTimeMillis();
tests[i].test(list);
longt2 = System.currentTimeMillis();
System.out.print(t2-t1+ "ms");
System.out.println();
}
}
publicstatic void main(String[] args){ List<String>list = null;
//测试数组的迭代和随机访问操作
System.out.println("------测试数组------");
String[]tstr = new String[SIZE];
Arrays.fill(tstr,"lion");
list= Arrays.asList(tstr);
testArray(list); tstr= new String[SIZE/2];
Collection<String>coll = Arrays.asList(tstr); //测试Vector
System.out.println("------测试Vector------");
list= new Vector<String>();
list.addAll(coll);
testList(list); //测试LinkedList
System.out.println("------测试LinkedList------");
list= new LinkedList<String>();
list.addAll(coll);
testList(list); //测试ArrayList
System.out.println("------测试Vector------");
list= new ArrayList<String>();
list.addAll(coll);
testList(list);
}
}
程序运行结果如图
从结果可以看出,对数组进行随机访问和迭代操作的速度是最快的;对LinkedList进行插入和删除操作的速度是最快的;对ArrayList进行随机访问的速度也很快;Vector类在各方面没有突出的性能,且此类已不提倡使用了。
Java数组和各种List的性能比较的更多相关文章
- 比较Java数组,ArrayList,LinkedList,Vector 性能比较
public class PerformanceTester { public static final int TIMES=100000; public static abstract class ...
- [转载]Java数组扩容算法及Java对它的应用
原文链接:http://www.cnblogs.com/gw811/archive/2012/10/07/2714252.html Java数组扩容的原理 1)Java数组对象的大小是固定不变的,数组 ...
- 怎么优化JAVA程序的执行效率和性能?
现在java程序已经够快的了,不过有时写出了的程序效率就不怎么样,很多细节值得我们注意,比如使用StringBuffer或者StringBuilder来拼接或者操作字符串就比直接使用String效率高 ...
- (二)Java数组特性总结,你真的了解数组吗?
一.数组的特殊性 (一)数组标识符是一个引用,指向堆中创建的一个真实对象,这个对象(数组)保存了指向保存其他对象的引用. (二)数组中保存引用类型时保存的是对象引用,基本数据类型数组保存基本数据的值. ...
- 1.1使用java数组,并开始封装我们自己的数组
今天感冒了,全身酸软无力,啥样不想做,就来学习吧,此节我们从初步使用java中提供的数组,然后分析相关情况,过渡到封装我们自己的数组. 一.我们先来感受一下java提供的数组,以整型数组(int[]) ...
- Java - 数组解析
java提高篇(十八)-----数组之一:认识JAVA数组 一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸 ...
- 把Java数组转换为List时的注意事项
本文由 ImportNew - 飘扬叶 翻译自 mlangc.欢迎加入翻译小组.转载请见文末要求. 不幸的是并不是每件事都尽如人意.举个例子,现在将一个Java数组转换为List.当然,我们可以使用A ...
- Java数组操作方法收集(快速判断某个值在这个数组中)
Java数组操作最高效的方式是循环取值,如果转换成集合那么就会分配内存,效率不如前者,但是方法多,需要在性能调优上去权衡.切记:数组是数组,集合是集合. 下面是收集最常用的数组转成集合的操作方法: i ...
- Java-杂项:Java数组Array和集合List、Set、Map
ylbtech-Java-杂项:Java数组Array和集合List.Set.Map 1.返回顶部 1. 之前一直分不清楚java中的array,list.同时对set,map,list的用法彻底迷糊 ...
随机推荐
- npm是干什么的?
允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用. 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用. 其实npm ...
- HighCharts使用总结
1.常用属性 chart: type:areaspline(线面图).arearange(区间图) zoomType: 缩放类型(沿着'xy'轴缩放) alignTicks:设置坐标轴刻度对齐. 当有 ...
- NG2-我们创建一个可复用的服务来调用英雄的数据
<英雄指南>继续前行.接下来,我们准备添加更多的组件. 将来会有更多的组件访问英雄数据,我们不想一遍一遍地复制粘贴同样的代码. 解决方案是,创建一个单一的.可复用的数据服务,然后学着把它注 ...
- C#基础笔记(第二十天)
1.复习属性:保护字段的构造函数:初始化对象初始化对象:给对象的每个属性去赋值什么时候会调用构造函数:当我们new的时候面向对象中需要注意的两个关键字this 1.代表当前类的对象 2.调用自己的构造 ...
- hud 5124 lines(思维 + 离散化)
http://acm.hdu.edu.cn/showproblem.php?pid=5124 lines Problem Description: John has several lines. ...
- 【OCP-12c】CUUG 071题库考试原题及答案解析(20)
20.choose two Examine the description of the EMP_DETAILS table given below: Which two statements are ...
- InnoDB: The innodb_system data file 'ibdata1' must be writable错误
重新安装percona5.7过程中,启动mysql服务总是报如下的错误 --10T02::.781070Z [ERROR] InnoDB: The innodb_system data file 'i ...
- HDU 3007 模拟退火算法
Buried memory Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- [ActionScript 3.0] 记录几个ByteArray 十六进制 String等相互转换的方法
/** * 通过hax数据返回ByteArray * @param hax 格式 "AA5A000100FF" */ private function getHax(hax:Str ...
- centos和ubuntu配置路由的三种方式
本篇总结三种修改路由的方式:route, ip route, 以及通过修改文件来配置路由,前2种命令行形式适用于ubuntu和centos,重启失效,最后一种永久有效. 一. route命令 ...