ArrayList与LinkedList区别

本文通过测试代码对比了ArrayList和LinkedList在get、iteration、insert、remove四种操作下的性能。结果显示,ArrayList在随机访问和迭代方面表现出色,而LinkedList在列表中间的插入和删除操作上更胜一筹。

ArrayList:

通过查看JDK1.8的源码发现ArrayList继承于AbstractList、List、RandomAccess、Cloneable、Serializable;

通过查看JDK1.8的源码发现ArrayList继承于AbstractSequentialList、List、Deque、Cloneable、Serializable;

 

 

以下为测试代码:

package com.tfq.chapter8;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;

public class ListPerformance {

	private static final int REPS=3000;
	private abstract static class Tester {
		String name;
		int size;
		Tester(String name,int size){
			this.name=name;
			this.size=size;
		}
		abstract void test(List a);
	}
	
	private static Tester[] tests= {
		new Tester("get",3000) {
				void test(List a) {
					for(int i=0;i<REPS;i++) {
						for(int j=0;j<a.size();j++)
							a.get(j);
					}
				}
			},
		new Tester("iteration",3000) {
				void test(List a) {
					for(int i=0;i<REPS;i++) {
						Iterator it=a.iterator();
						while(it.hasNext())
							it.next();
					}
				}
			},
		new Tester("insert",3000) {
				void test(List a) {
					int half=a.size()/2;
					String s="test";
					ListIterator it=a.listIterator(half);
					for(int i=0;i<size*10;i++) {
						it.add(s);
					}
				}
			},
		new Tester("remove",3000) {
				void test(List a) {
					ListIterator it=a.listIterator(3);
					while(it.hasNext()) {
						it.next();
						it.remove();
						
					}
				}
			},
	};
	
	public static void test(List a) {
		//A trick to print out the class name;
		System.out.println("Testing="+a.getClass().getName()+",size()="+tests.length);
		for(int i=0;i<tests.length;i++) {
			Collection1.fill(a,tests[i].size);
			System.out.println(tests[i].name);
			long t1=System.currentTimeMillis();
			tests[i].test(a);
			long t2=System.currentTimeMillis();
			System.out.println(":"+(t2-t1));
		}		
	}
	
	public static void main(String[] args) {
		test(new ArrayList());
		test(new LinkedList());
	}
	
	
}

运行测试代码结果如下:

Typegetiterationinsertremove
ArrayList71126184
LinkedList104839612

由于测试用机器的不同,结果当然也会有所区别。这个程序的宗旨是提示出不同集合类型的相对性能比较。

可以看出,在ArrayList中随机访问(即get())以及循环反复是最划得来的;但对于LinkedList却是一个不小的开销。但另一方面,在列表中部进行插入和删除操作对于LinkedList来说却比ArrayList划算多。我们最好的做法也许是先选择一个ArrayList作为自己的默认起点。以后若发现由于大量的插入和删除造成了性能的降低,再考虑换成LinkedList不迟。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值