哈希集内部可以使用其他集合而不是哈希映射

时间:2017-07-30 05:12:27

标签: java collections hashmap hashset

为什么Hash set内部只使用Hash map?它与性能有关吗?

3 个答案:

答案 0 :(得分:1)

HashSet可以被认为是HashMap的一个特例,在这种情况下,您实际上并不关心值的类型,只关注值是否与特定键相关联。

因此,将一个实现在另一个之上是有意义的。 如果您的密钥类型具有良好的散列函数,则HashMap是一个不错的选择。

类似地,TreeSet是使用TreeMap实现的,如果您的密钥是有序的/可比较的,这可能会有效。

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

答案 1 :(得分:0)

不,这很方便,而且大多数虚拟机的效率实际上并不高。所以Java - 至少在某些实现中 - 并不打算做任何更好的事情。

答案 2 :(得分:0)

由于HashMap和HashSet基本上使用相同的算法,因此不再实现两次就更简单了,因此,一些(如果不是全部)JVM实现就可以做到这一点并不令人惊讶。 它也适用于LinkedHashMap / Set,TreeMap / Set等。

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

顺便说一下,JDK提供了一个Collections.newSetFromMap方法,它完全按照以下方式执行:它通过将所有键映射到Map<E,Boolean>Set<E>转换为Boolean.TRUE。当Map实现没有相应的Set实现时,此实用程序方法非常有用,例如对于ConcurrentHashMap。

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