如何在Java中向HashSet添加20.000.000个随机整数?这需要很长时间。这是我的代码:
final int SET_SIZE=20000000;
Set<Integer> set1 = new HashSet<Integer>();
for(int i=1;i<=SET_SIZE;i++)
set1.add(i);
答案 0 :(得分:0)
当您向HashSet添加条目(随机或其他)时,Set必须增大。每次,当它超出限制时,它必须重新处理所有条目,以确保它们最终位于较大尺寸集合的正确bin中。
你可以通过告诉HashSet提前预计它有多大来加快速度。在这种情况下,您确切知道它有多大,因此您可以预先分配正确大小的结构。
Set<Integer> set1 = new HashSet<>(SET_SIZE);
JSYK:
HashSet<Integer>
可能不是您用例的最佳数据结构。如果您只存储非负Integer
值,从0到某个限制(SET_SIZE
),并且您的设置没有备用,您可能需要考虑使用改为BitSet
。
BitSet
将每个值的存在与否存储为单个位。因此,BitSet
的内存需求是存储在集合中的最大整数的函数; BitSet
可以存储0到2千万的所有Integer
值,只需要250万字节的存储空间。
相反,HashSet<Integer>
的内存要求是存储在其中的数字条目的函数。如果每个条目占用32个字节,那么在78125个条目存储在HashSet<Integer>
之后,它将占用比{2000}的BitSet
更多的内存。
答案 1 :(得分:0)
final int SET_SIZE=20000000;
Set<Integer> set1 = new HashSet<Integer>();
Random rand = new Random();
for(int i=1;i<=SET_SIZE;i++)
et1.add(rand.nextInt());