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类在各方面没有突出的性能,且此类已不提倡使用了。

 

时间: 2024-11-05 16:55:29

Java数组和各种List的性能比较的相关文章

比较Java数组,ArrayList,LinkedList,Vector 性能比较

public class PerformanceTester { public static final int TIMES=100000; public static abstract class Tester{ private String operation; public Tester(String operation){this.operation=operation;} public abstract void test(List<String> list); public Str

把Java数组转换为List时的注意事项

本文由 ImportNew - 飘扬叶 翻译自 mlangc.欢迎加入翻译小组.转载请见文末要求. 不幸的是并不是每件事都尽如人意.举个例子,现在将一个Java数组转换为List.当然,我们可以使用Arrays.asList方法,但是如果没有慎重思考就随便使用几乎肯定会产生令人讨厌的意外.考虑完下面这段程序并预测其输出你就明白我的意思了: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package com.wordpress.mla

Java - 数组解析

java提高篇(十八)-----数组之一:认识JAVA数组 一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的! 但是这只是数组的最表面的东西!深一点?就是这样:数组是一个简单的复合数据类型,它是一系列有序数据的集合,它当中的每一个数据都具有相同的数据类型,我们通过数组名加上一个不会越界下标值来唯一确定数组中的元素. 还有更深的,那就是数组是一个特殊的对象!!(对于这个LZ理解的不是很好,对JVM

[转载]Java数组扩容算法及Java对它的应用

原文链接:http://www.cnblogs.com/gw811/archive/2012/10/07/2714252.html Java数组扩容的原理 1)Java数组对象的大小是固定不变的,数组对象是不可扩容的. 2)利用数组复制方法可以变通的实现数组扩容. 3)System.arraycopy()可以复制数组. 4)Arrays.copyOf()可以简便的创建数组副本. 5)创建数组副本的同时将数组长度增加就变通的实现了数组的扩容.  源码展示: 1 public class Array

Java 数组,看这一篇就够了

在 Java 泛型出现之前,只有数组可以用来存储指定类型的对象:在自动装箱机制出现之前,只有数组可以用来存储基本数据类型:也就是说,在泛型和自动装箱机制出现之前,数组在 Java 当中的分量举足轻重. 况且数组还是一种效率最高的存储和随机访问对象序列的方式,但遗憾的是,数组的长度是固定的--举个例子,创建它的时候指定长度是 6,就只能存储 6 个元素,当你想放第 7 个元素时,是无法做到的. 随着计算机硬件能力的提升,开发人员在存储一组数据的时候更愿意使用 ArrayList 而不是数组.尽管

Java数组合并方法学习。

参考博客: https://blog.csdn.net/liu_005/article/details/72760392 https://blog.csdn.net/jaycee110905/article/details/9179227 在做一道算法题的时候用到数组合并,并且有性能要求,这里对Java数组合并进行学习总结. 分析可以得出,因为数组是定长的,所以解决方法,构造一个新数组,将需要合并的数组放到新数组里面. 使用Arrays.copyOf来构造一个合并之后长度的数组,并将其中一个数组

Java 数组学习笔记

数组的简单认识 简单理解java数组,就是可以创建并组装它们,通过使用整型索引值访问它们的元素,并且它们的尺寸不能改变,这里的它们就是数组. 数组的特殊性 在java中有很多方式去持有对象,那么数组的与众不同点在哪里? 数组与其他种类的容器区别有三个方面:效率.类型和保存基本类型的能力. 在java中,数组是一种效率最高的存储和随机访问对象引用序列的方式.数组就是一个简单的线性序列,这使得元素访问非常迅速.但是为之付出的代价就是数组对象的大小被固定,并且在其生命周期中不可改变. 在泛型之前,其他

Java数组与内存控制

一.Java数组初始化 Java数组是静态的,即当数组被初始化之后,该数组的长度是不可变的.Java数组使用之前必须先对数组对象进行初始化,所谓初始化,就是为数组的所有元素分配内存空间,并为每个数组元素指定初始值.(文章来源于李刚老师的<突破java程序员的16课>) 1:基本类型数组的两种初始化方式 静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度. 动态初始化:初始化时程序员只指定数组长度,由系统为数组元素分配初始值. 不要同时使用静态初始化和动态初始化,也就是

JAVA数组的定义及用法

数组是有序数据的集合,数组中的每一个元素具有同样的数组名和下标来唯一地确定数组中的元素. 1. 一维数组 1.1 一维数组的定义 type arrayName[]; type[] arrayName; 当中类型(type)能够为Java中随意的数据类型,包含简单类型组合类型,数组名arrayName为一个合法的标识符,[]指明该变量是一个数组类型变量. 另外一种形式对C++开发人员可能认为非常奇怪,只是对JAVA或C#这种开发语言来说,另外一种形式可能更直观,由于这里定义的仅仅是个变量而已,系统