【问题标题】:Can hash set internally use some other collection instead of hash map哈希集可以在内部使用其他集合而不是哈希映射
【发布时间】:2018-01-05 21:16:36
【问题描述】:

为什么像Hash set内部只使用Hash map?和性能有关系吗?

【问题讨论】:

  • 不,是因为名字。如果它使用其他东西,它就不会被称为HashSet

标签: java collections hashmap hashset


【解决方案1】:

可以将 HashSet 视为 HashMap 的一种特殊情况,您实际上并不关心值的类型,只关心值是否与特定的键相关联。

因此,仅在另一个之上实现一个是有意义的。 如果您的键类型具有良好的哈希函数,则 HashMap 是一个不错的选择。

同样,TreeSet 是使用 TreeMap 实现的,如果您的键是有序/可比较的,这将是有效的。

您可以通过许多其他方式实现 Set 接口,但这些是典型的。

【讨论】:

    【解决方案2】:

    不,它只是方便,而且在大多数虚拟机上实际上并没有降低效率。所以 Java——至少在某些实现中——不会费心去做任何更花哨的事情。

    【讨论】:

      【解决方案3】:

      由于 HashMap 和 HashSet 基本上使用相同的算法,因此不实现两次会更简单,因此即使不是全部,也有少数 JVM 实现这样做也就不足为奇了。 LinkedHashMap/Set、TreeMap/Set 等也可以使用。

      更一般地说,可以通过选择与键相同的值或常量来从任何 Map 实现创建任何 Set 实现。 内存存储的损失可以忽略不计。

      顺便说一句,JDK 提供了一个Collections.newSetFromMap 方法,它正是这样做的:它通过将所有键映射到Boolean.TRUE 来将Map<E,Boolean> 转换为Set<E>。当 Map 没有对应的 Set 实现时,此实用方法非常有用,例如用于 ConcurrentHashMap。

      相反,从Set 创建一个 Map 实现也是可行的,但稍微困难一些。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多