您的位置:首页 > 其它

ArrayList和LinkedList的各项操作性能比较

2013-08-12 17:28 447 查看
如果用java编写程序,我们通常存储易变的数据集合时用到的数据结构往往是ArrayList,不过,在JDK中还存在另一个结构--LinkedList,只不过我们通常不用,原因在于性能问题,下面,我就以一个问题来分析下这两个结构的性能差别。

问题:

自己编写一个测试程序,测试验证ArrayList和LinkedList在做增、删、改、遍历等操作上的性能差异。


首先,我先给出ArrayList的测试类:

package com.brucezhang.arraylinkedtest;

import java.util.ArrayList;

public class My_ArrayList_Test {

//定义循环次数常量
private static final int count = 100000;
//定义ArrayList
private ArrayList<Integer> my_array = new ArrayList<Integer>();

//存数据进ArrayList--增
public void addToArray() {
long begin = System.currentTimeMillis();
for(int i = 0; i < count; i++){
my_array.add(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "ArrayList.add()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}

//删除数据从ArrayList--删
public void delFromArray() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_array.size(); i++){
my_array.remove(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "ArrayList.remove()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}

//修改ArrayList中的数据--改
public void updateArray() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_array.size(); i++){
my_array.set(i, i+1);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "ArrayList.set()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}

//查询ArrayList中的数据--查
public void selFromArray() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_array.size(); i++){
my_array.get(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "ArrayList.get()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}
}

下面,给出的是LinkedList的测试类:


package com.brucezhang.arraylinkedtest;

import java.util.LinkedList;

public class My_LinkedList_Test {

//定义循环次数常量
private static final int count = 100000;

//定义LinkedList
private LinkedList<Integer> my_link = new LinkedList<Integer>();

//存入数据进LinkedList--增
public void addToLink() {
long begin = System.currentTimeMillis();
for(int i = 0; i < count; i++){
my_link.add(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "LinkedList.add()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}

//删除数据从LinkedList--删
public void delFromLink() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_link.size(); i++){
my_link.remove(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "LinkedList.remove()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}

//修改LinkedList中的数据--改
public void updateLink() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_link.size(); i++){
my_link.set(i, i+1);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "LinkedList.set()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}

//查询LinkedList中的数据--查
public void selFromLink() {
long begin = System.currentTimeMillis();
for(int i = 0; i < my_link.size(); i++){
my_link.get(i);
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + "LinkedList.get()方法需要的时间是:"
+ (over - begin) + " 毫秒 ");
}
}

好了,最后给出主测试程序:

package com.brucezhang.arraylinkedtest;

public class Main_Class {

/**
* @param args
* Author:DlutBruceZhang
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

//测试ArrayList的各项操作
ArrayTest();

//测试LinkedList的各项操作
LinkTest();
}

public static void ArrayTest(){
System.out.println("--------------------------------------------------");
My_ArrayList_Test arrayTest = new My_ArrayList_Test();
arrayTest.addToArray();
arrayTest.updateArray();
arrayTest.selFromArray();
arrayTest.delFromArray();
System.out.println("--------------------------------------------------");
}

public static void LinkTest(){
System.out.println("--------------------------------------------------");
My_LinkedList_Test linkTest = new My_LinkedList_Test();
linkTest.addToLink();
linkTest.updateLink();
linkTest.selFromLink();
linkTest.delFromLink();
System.out.println("--------------------------------------------------");
}

}

测试的结果如下所示:

--------------------------------------------------
操作 ArrayList.add()方法需要的时间是:9 毫秒
操作 ArrayList.set()方法需要的时间是:7 毫秒
操作 ArrayList.get()方法需要的时间是:4 毫秒
操作 ArrayList.remove()方法需要的时间是:1311 毫秒
--------------------------------------------------
--------------------------------------------------
操作 LinkedList.add()方法需要的时间是:9 毫秒
操作 LinkedList.set()方法需要的时间是:8715 毫秒
操作 LinkedList.get()方法需要的时间是:8700 毫秒
操作 LinkedList.remove()方法需要的时间是:6672 毫秒
--------------------------------------------------

由结果我们可以得出结论:

1.两个结构在存储数据方面所用时间没有太大的区别

2.两个结构在更改,查询,删除结构中的数据时性能差别“巨大”,且ArrayList优于LinkedList很多,明显不是在一个数量级上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: