HashMap<Integer,Integer> の場合、10000000 個の一意のランダム値を挿入した後。次のコード スニペットのように、ハッシュマップの keySet() を使用して get() を実行します。
HashMap<Integer, Integer> hashmap =
new HashMap<Integer, Integer>(10000000, 0.99f);
// ... Code to put unique 10000000 associations into the hashmap ...
int iteration = 100;
long startTime, totalTime = 0;
while(iteration > 0) {
for(Integer key: hashmap.keySet()) {
startTime = System.currentTimeMillis();
hashmap.get(key);
totalTime += (System.currentTimeMillis() - startTime);
}
iteration--;
}
System.out.println(totalTime/100 + " ms");
上記のコードを実行すると、次のようになります: 225 ms
ここで、次のスニペットのように、代わりにセットを使用するように上記のコードを変更すると:
Set<Integer> set = new HashSet<Integer>(hashmap.keySet());
while(iteration > 0) {
for(Integer key: set) {
startTime = System.currentTimeMillis();
hashmap.get(key);
totalTime += (System.currentTimeMillis() - startTime);
}
iteration--;
}
System.out.println(totalTime/100 + " ms");
そして、このコードを実行した後、次のようになります: 414 ミリ秒
なぜこのようなパフォーマンスの違いが生じるのでしょうか?
PS: 次の JVM 引数を使用しました。
-Xms2048m -Xmx4096m -XX:MaxPermSize=256m