JAVA ArrayList LinkedList 效率

177 阅读1分钟

public class ListPerformance {
	
	
	private static final int PERPS = 1000;
	
	private abstract static class Tester{
		String name;
		int size;
		/**
		 * @param name
		 * @param size
		 */
		Tester(String name, int size) {
			this.name = name;
			this.size = size;
		}
		abstract void test(List a);
		
	}
	
	private static Tester[] tests = {
			new Tester("add",300) {
				
				void test(List a) {
					for(int i =0; i < PERPS; i++){
						for(int j = 0; j < size;j++){
							a.add((i+"")+(j+""));
						}
					}
				}
			},
			new Tester("get",300) {
				
				void test(List a) {
					for(int i =0; i < PERPS; i++){
						for(int j = 0; j < size;j++){
							a.get(j);
						}
					}
				}
			},
			new Tester("iterator",300) {
				
				@Override
				void test(List a) {
					for(int i =0; i < PERPS; i++){
						Iterator iterator  = a.iterator();
						while(iterator.hasNext()){
							iterator.next();
						}
					}
					
				}
			},
			new Tester("insert",1000) {
				
				
				@Override
				void test(List a) {
					int half = a.size()/2;
					String testStr = "test";
					ListIterator it = a.listIterator(half);
					for(int i = 0; i< size*10; i++){
						it.add(testStr);
					}
					
				}
			} 
	};
	
	public static void test(List a){
		System.out.println("tesing:" + a.getClass().getName());
		for(int i = 0;i < tests.length;i++){
			System.out.print(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) {;
		ArrayList arrayList = new ArrayList<>();
		LinkedList linkList = new LinkedList<>();
		test(arrayList);
		test(linkList);
		System.out.println();

	}

}


ArrayList LinkedList 效率对比
add
get
iterator
insert
remove
ArrayList
122
7
50
788
7478
LinkedList
75
76
10923
9
29
 ArrayList 随机 插入 删除慢 查询 循环 快 底层是数组 连续的内存地址
 LinkedList 随机 插入 删除快 查询 循环 慢 底层是链表 对象引用,不是连续的内存地址

  注:别用for循环遍历LinkedList,用迭代器,有兴趣的同学自己试试。