を Iterator で回す
サンプル
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeMap;
public class LoopTest {
private int SIZE = 99999;
private HashMap<String, String> map;
private TreeMap<String, String> tree;
private ArrayList<String> list;
private String[] arr;
public static void main(String[] args) {
new LoopTest().run();
}
public void run() {
// データ作成
createArr();
createMap();
createList();
createTree();
// テスト実行
testArrGet();
testListIterator();
testListIterator2();
testListGet();
testMapIterator();
testMapGet();
testTreeIterator();
testTreeGet();
}
private void createTree() {
tree = new TreeMap<String, String>();
for (int i = 0; i < SIZE; i++) {
tree.put("" + i, "" + i);
}
}
private void createArr() {
arr = new String[SIZE + 1];
for (int i = 0; i < SIZE; i++) {
arr[i] = "" + i;
}
}
private void createList() {
list = new ArrayList<String>();
for (int i = 0; i < SIZE; i++) {
list.add("" + i);
}
}
private void createMap() {
map = new HashMap<String, String>();
for (int i = 0; i < SIZE; i++) {
map.put("" + i, "" + i);
}
}
private void testTreeGet() {
long start = System.currentTimeMillis();
for (int i = 0; i < tree.size(); i++) {
String tmp = tree.get("" + i);
}
long end = System.currentTimeMillis();
System.out.println("testTreeGet:" + (end - start));
}
private void testTreeIterator() {
long start = System.currentTimeMillis();
for (Iterator<String> it = tree.values().iterator(); it.hasNext();) {
String tmp = it.next();
}
long end = System.currentTimeMillis();
System.out.println("testTreeIterator:" + (end - start));
}
private void testArrGet() {
long start = System.currentTimeMillis();
for (int i = 0; i < arr.length; i++) {
String tmp = arr[i];
}
long end = System.currentTimeMillis();
System.out.println("testArrGet:" + (end - start));
}
private void testMapGet() {
long start = System.currentTimeMillis();
for (int i = 0; i < map.size(); i++) {
String tmp = map.get("" + i);
}
long end = System.currentTimeMillis();
System.out.println("testMapGet:" + (end - start));
}
private void testMapIterator() {
long start = System.currentTimeMillis();
for (Iterator<String> it = map.values().iterator(); it.hasNext();) {
String tmp = it.next();
}
long end = System.currentTimeMillis();
System.out.println("testMapIterator:" + (end - start));
}
private void testListGet() {
long start = System.currentTimeMillis();
for (int i = 0; i < list.size(); i++) {
String tmp = list.get(i);
}
long end = System.currentTimeMillis();
System.out.println("testListGet:" + (end - start));
}
private void testListIterator() {
long start = System.currentTimeMillis();
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String tmp = it.next();
}
long end = System.currentTimeMillis();
System.out.println("testListIterator:" + (end - start));
}
private void testListIterator2() {
long start = System.currentTimeMillis();
for (String str : list) {
String tmp = str;
}
long end = System.currentTimeMillis();
System.out.println("testListIterator2:" + (end - start));
}
}
結果
testArrGet:0
testListIterator:13
testListIterator2:0
testListGet:16
testMapIterator:16
testMapGet:109
testTreeIterator:31
testTreeGet:125
以上のような結果となりました。
数値が小さいほど速いということになります。
結論
Listを使うのであれば、testListIterator2メソッドの処理のように、
for (String str : list) {...} な回し方がベスト。
上記の記述だとIterator使うよりもさらに速い。
Mapを使う場合は、Iteratorを利用するべし。
速度が必要でMap機能が必要ないのであれば、できるだけListを使うとよい。