リストを巡る効率

1898 ワード

1.一般的にリストを巡回する方法
 
リストを巡る方法は3つあります.
a) for (Iterator iterator = ls.iterator(); iterator.hasNext();)
b) for (int i = 0; i < ls.size(); i++)
c) for (Object object : ls) (java5+)
一般的なList実装は2つあります.
a) java.util.ArrayList
b) java.util.LinkedList
 
効率はどうですか.
 
2.遍歴方法の小誤差検証
 
出力:
class java.util.ArrayList
iterator-nanotime :7199195
arraylike-nanotime:1920143
foreach-nanotime :3775320
class java.util.LinkedList
iterator-nanotime :5430188
arraylike-nanotime:9148595046
foreach-nanotime :1677620
 
方法:
 
private static void nanoLoop(List ls){
	System.out.println(ls.getClass());
	{ // iterator
		long b = System.nanoTime();
		for (Iterator iterator = ls.iterator(); iterator.hasNext();) {
			Object object = (Object) iterator.next();
		}
		System.out.println("iterator-nanotime :"+(System.nanoTime()-b));
	}
	
	{ // array-like
		long b = System.nanoTime();
		for (int i = 0; i < ls.size(); i++) {
			Object object = (Object) ls.get(i);
		}
		System.out.println("arraylike-nanotime:"+(System.nanoTime()-b));
	}
	
	{ // foreach
		long b = System.nanoTime();
		for (Object object : ls) {
			Object s = (Object) object;
		}
		System.out.println("foreach-nanotime  :"+(System.nanoTime()-b));
	}
}

private static List initList(List ls,int count){
	for (int i = 0; i < count; i++) {
		ls.add("aaaa");
	}
	return ls;
}

public static void main(String[] args) {
	nanoLoop(initList(new ArrayList(),10*10000));
	nanoLoop(initList(new LinkedList(),10*10000));
}
 
 
3.無謀な結論
 
*ブラックボックスの場合:foreach>iterator>arraylike
 * ArrayList :arraylike>foreach >iterator
 * LinkedList:foreach >iterator >>>arraylike
 
4.根掘り葉掘り聞く
 
read the fk source code -_-