【问题标题】:Relation between HashMap and HashSet [duplicate]HashMap和HashSet之间的关系[重复]
【发布时间】:2013-06-27 05:41:25
【问题描述】:

HashSet 和 HashMap 有什么关系?

From javadoc:

HashSet

public HashSet()

Constructs a new, empty set; the backing HashMap instance has default initial 

容量 (16) 和负载系数 (0.75)。

“负载系数”是什么意思? 提前致谢。

【问题讨论】:

标签: java hashmap hashset


【解决方案1】:

HashSet是按照HashMap实现的:

此类实现Set 接口,由哈希表(实际上是HashMap 实例)支持。

负载系数在documentation中解释:

HashMap 的实例有两个影响其性能的参数:初始容量和负载因子。容量是哈希表中的桶数,初始容量只是哈希表创建时的容量。负载因子是哈希表在其容量自动增加之前允许达到的程度的度量。当哈希表中的条目数超过负载因子和当前容量的乘积时,对哈希表进行重新哈希(即重建内部数据结构),使哈希表的桶数大约增加一倍。

作为一般规则,默认负载系数 (.75) 在时间和空间成本之间提供了良好的折衷。较高的值会减少空间开销,但会增加查找成本(反映在 HashMap 类的大多数操作中,包括 get 和 put)。在设置其初始容量时,应考虑映射中的预期条目数及其负载因子,以尽量减少重新哈希操作的次数。如果初始容量大于最大条目数除以负载因子,则不会发生重新哈希操作。

【讨论】:

    【解决方案2】:

    来自HashSet的源码

    public HashSet(Collection<? extends E> c) {
        map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
        addAll(c);
    }
    

    【讨论】:

      【解决方案3】:

      HashSet 和 HashMap 有什么关系?

      关系是每个HashSet&lt;T&gt;里面都有一个私有的HashMap&lt;T, Object&gt;。 (在 Java 7 版本中,值是私有的 Object 实例...)

      “负载系数”是什么意思?

      术语“负载系数”在javadoc 中为HashMap 定义。你可以在那里阅读它。 (这就是它的目的......)

      参考:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-05
        • 2018-05-15
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 2017-06-05
        • 1970-01-01
        • 2012-11-28
        相关资源
        最近更新 更多