【发布时间】:2018-01-05 21:16:36
【问题描述】:
为什么像Hash set内部只使用Hash map?和性能有关系吗?
【问题讨论】:
-
不,是因为名字。如果它使用其他东西,它就不会被称为
HashSet。
标签: java collections hashmap hashset
为什么像Hash set内部只使用Hash map?和性能有关系吗?
【问题讨论】:
HashSet。
标签: java collections hashmap hashset
可以将 HashSet 视为 HashMap 的一种特殊情况,您实际上并不关心值的类型,只关心值是否与特定的键相关联。
因此,仅在另一个之上实现一个是有意义的。 如果您的键类型具有良好的哈希函数,则 HashMap 是一个不错的选择。
同样,TreeSet 是使用 TreeMap 实现的,如果您的键是有序/可比较的,这将是有效的。
您可以通过许多其他方式实现 Set 接口,但这些是典型的。
【讨论】:
不,它只是方便,而且在大多数虚拟机上实际上并没有降低效率。所以 Java——至少在某些实现中——不会费心去做任何更花哨的事情。
【讨论】:
由于 HashMap 和 HashSet 基本上使用相同的算法,因此不实现两次会更简单,因此即使不是全部,也有少数 JVM 实现这样做也就不足为奇了。 LinkedHashMap/Set、TreeMap/Set 等也可以使用。
更一般地说,可以通过选择与键相同的值或常量来从任何 Map 实现创建任何 Set 实现。 内存存储的损失可以忽略不计。
顺便说一句,JDK 提供了一个Collections.newSetFromMap 方法,它正是这样做的:它通过将所有键映射到Boolean.TRUE 来将Map<E,Boolean> 转换为Set<E>。当 Map 没有对应的 Set 实现时,此实用方法非常有用,例如用于 ConcurrentHashMap。
相反,从Set 创建一个 Map 实现也是可行的,但稍微困难一些。
【讨论】: