在Java中将随机整数添加到HashSet的更快方法?

时间:2018-03-29 05:10:47

标签: java algorithm collections set

如何在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);

2 个答案:

答案 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());