【问题标题】:Why initialize HashSet<>(0) to zero?为什么将 HashSet<>(0) 初始化为零?
【发布时间】:2013-08-07 05:48:37
【问题描述】:

我喜欢 HashSet() 并在使用默认构造函数初始化它时急切地使用它:

Set<Users> users = new HashSet<>();

现在,我的自动 bean 创建器(JBoss 工具)将其初始化为:

Set<Users> users = new HashSet<>(0);

为什么是? API 告诉我这是初始容量,但将其设为零有什么好处?这是建议吗?

【问题讨论】:

    标签: java constructor initialization hashset zero


    【解决方案1】:

    HashMap的Initial Load factor是16。当HashMap保存12条Record的数据时,是其初始大小的75%。然后 HashMap 增加它的大小。

    所以这里我们只是将初始容量设置为 0,通过在构造函数中传递它。

    【讨论】:

      【解决方案2】:

      HashSet 使用 HashMap 存储数据:

      public HashSet(int initialCapacity) {
      map = new HashMap<E,Object>(initialCapacity);
      }
      

      虽然初始容量 = 0,

      public HashMap(int initialCapacity, float loadFactor) {
          ....
          // Find a power of 2 >= initialCapacity
          int capacity = 1;
          while (capacity < initialCapacity)
              capacity <<= 1;
      }
      

      HashMap 容量为1

      但如果使用默认构造函数:

      public HashMap() {
          this.loadFactor = DEFAULT_LOAD_FACTOR;
          threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
          table = new Entry[DEFAULT_INITIAL_CAPACITY];
          init();
      }
      

      HashMap 容量为16*0.75

      所以,new HashSet&lt;&gt;(0) 在初始化时保存一些内存。

      【讨论】:

        【解决方案3】:

        default initial capacity is 16,因此通过传入 0,如果您最终没有将任何内容放入集合中,您可能会节省几个字节的内存。

        除此之外没有真正的优势;当您传递 0 时,将创建容量为 1 的集合,并且一旦您添加了某些内容,它就必须调整大小。

        【讨论】:

        • @PeterLawrey,怎么会?不是 2 吗?
        • @PeterLawrey, 是 2。它必须是 2 的幂 >= 2。参见 HashMap(int, int); 的构造函数;
        • @Vash 1 是 2 的幂。From HashMap ` // 求 2 的幂 >= initialCapacity int capacity = 1; while (容量
        • @PeterLawrey,是的,我们没有进入班次,因为 1
        【解决方案4】:

        这会将其设置为最小值。

        这很可能用于关闭代码分析器,如果您没有为集合设置初始容量,代码分析器可能会报错。通过将其设置为 0,您只需将其设置为最小值。

        这并不是什么优化,因为一旦添加条目,负载因子 0.7 将使容量变为 2,在此过程中重新创建 Map.Entry[]

        【讨论】:

          【解决方案5】:

          If you see docs

          有一些线索。

          迭代这个集合需要的时间与 HashSet 实例的大小(元素的数量)加上支持 HashMap 实例的“容量”(桶的数量)的总和成正比。因此,如果迭代性能很重要,那么不要将初始容量设置得太高(或负载因子太低)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-23
            • 2011-01-10
            • 2021-12-27
            • 1970-01-01
            • 2019-06-13
            • 1970-01-01
            • 2011-12-21
            相关资源
            最近更新 更多