追記
(続)Setの展開はどれが一番早い? - かまたま日記2
再調査をしたところ結果が変わっています。
- -
ってことで調査してみました。
- toArray()で配列に変換してから展開
- for-eachで展開
- iteratorを使って展開
- Listに変換してから展開
import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; public class SetExpansionTest { public static void main(String[] args) { int testcount = 5000000; Set<String> testSet = new HashSet<String>(); for (int i = 0; i < testcount; i++) { testSet.add("test" + i); } long start = System.currentTimeMillis(); String[] array = testSet.toArray(new String[testcount]); int count = 0; for (int i = 0; i < array.length; i++) { count++; } System.out.println("toArray:" + (System.currentTimeMillis()-start) + " count:" +count); start = System.currentTimeMillis(); count = 0; for (String string : testSet) { count++; } System.out.println("foreach:" + (System.currentTimeMillis()-start) + " count:" +count); start = System.currentTimeMillis(); count = 0; for (Iterator iterator = testSet.iterator(); iterator.hasNext();) { iterator.next(); count++; } System.out.println("iterator:" + (System.currentTimeMillis()-start) + " count:" +count); start = System.currentTimeMillis(); List<String> testList = new ArrayList<String>(testSet); count = 0; for (String string : testList) { count++; } System.out.println("list:" + (System.currentTimeMillis()-start) + " count:" +count); } }
結果
100万件
toArray:48 count:1000000 foreach:30 count:1000000 iterator:29 count:1000000 list:50 count:1000000
500万件
toArray:158 count:5000000 foreach:126 count:5000000 iterator:130 count:5000000 list:436 count:5000000
普通にforeachもしくはiteratorで回すのが一番見たいです。
toArrayとListは変換コストがバカにならない様子。