您的位置:首页 > 其它

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

2013-08-12 17:28 288 查看
如果用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很多,明显不是在一个数量级上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: