因此,最初,我有以下代码:
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次操作。如果通常在一秒钟内执行100,000,000次操作,我的代码为什么要花4秒钟才能运行?
此外,如果hashSet.remove(i);
注释掉该行,则代码仅需16ms。如果内部的for循环被注释掉了(但未注释掉hashSet.remove(i);
),则代码仅需8ms。
4
我确认你的发现。我可以推测其原因,但希望有人会发表有趣的解释。
—
khelwood
看起来
—
khelwood
for val
循环是占用时间的事情。该remove
还是非常快的。在修改集合后需要某种开销来设置新的迭代器...?
@apangin在stackoverflow.com/a/59522575/108326中提供了一个很好的解释,说明了
—
markusk
for val
循环缓慢的原因。但是,请注意,根本不需要循环。如果您要检查集合中是否有不同于-1的值,则检查效率会更高hashSet.size() > 1 || !hashSet.contains(-1)
。