【问题标题】:Faster way to adding random integers to HashSet in Java?在 Java 中将随机整数添加到 HashSet 的更快方法?
【发布时间】:2018-09-07 23:05:33
【问题描述】:

如何在 Java 中将 20.000.000 个随机整数添加到 HashSet?这需要很长时间。这是我的代码:

final int SET_SIZE=20000000;
Set<Integer> set1 = new HashSet<Integer>();
for(int i=1;i<=SET_SIZE;i++)
    set1.add(i);

【问题讨论】:

  • 我连一个随机整数都看不到。或者一个可以回答的问题。
  • 我先尝试添加整数 i

标签: java algorithm collections set


【解决方案1】:

当您向 HashSet 添加条目(随机或其他)时,Set 的大小必须增加。每次,当它超出限制时,它必须重新处理所有条目以确保它们最终进入更大尺寸集的正确 bin 中。

您可以通过提前告诉 HashSet 您期望它有多大来加快速度。在这种情况下,您确切地知道它有多大,因此您可以预先分配正确大小的结构。

Set<Integer> set1 = new HashSet<>(SET_SIZE);

JSYK:

HashSet&lt;Integer&gt; 可能不是您用例的最佳数据结构。如果您只存储非负的 Integer 值,从 0 到某个限制 (SET_SIZE),并且您的集合不是多余的,您可能需要考虑使用 BitSet而是。

BitSet 将每个值的存在或不存在存储为单个位。因此,BitSet 的内存需求是该集合中存储的最大整数的函数;可以存储从 0 到 2000 万的所有 Integer 值的 BitSet 只需要 250 万字节的存储空间。

相比之下,HashSet&lt;Integer&gt; 的内存需求是其中存储的条目数的函数。如果每个条目占用 32 个字节,那么在将 78125 个条目存储到 HashSet&lt;Integer&gt; 之后,它会比 BitSet 占用 2000 万位更多的内存。

【讨论】:

    【解决方案2】:
    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());
    

    【讨论】:

      猜你喜欢
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2013-03-24
      • 2017-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多