だから、もともと、私はこのコードを持っていました:
import java.util.*;
public class sandbox {
public static void main(String[] args) {
HashSet<Integer> hashSet = new HashSet<>();
for (int i = 0; i < 100_000; i++) {
hashSet.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 100_000; i++) {
for (Integer val : hashSet) {
if (val != -1) break;
}
hashSet.remove(i);
}
System.out.println("time: " + (System.currentTimeMillis() - start));
}
}
私のコンピューターでネストされたforループを実行するのに約4秒かかり、なぜそんなに長くかかったのか分かりません。外側のループは100,000回実行され、内側のforループは1回実行される必要があります(hashSetの値が-1になることはないため)。また、HashSetからのアイテムの削除はO(1)なので、約200,000回の操作が必要です。通常、1秒あたり100,000,000回の操作がある場合、コードの実行に4秒かかるのはなぜですか?
さらに、行hashSet.remove(i);
がコメント化されている場合、コードの所要時間はわずか16ミリ秒です。内部のforループがコメント化されている場合(ただし、コメント化されていない場合hashSet.remove(i);
)、コードは8ミリ秒しかかかりません。
for val
ループは時間がかかるもののようです。remove
非常に速く、まだです。セットが変更された後に新しいイテレータを設定するなんらかのオーバーヘッド...?
for val
ループが遅い理由を説明しています。ただし、ループはまったく必要ないことに注意してください。セットに-1とは異なる値があるかどうかを確認する場合は、確認する方がはるかに効率的hashSet.size() > 1 || !hashSet.contains(-1)
です。