2017-07-30 69 views

回答

0

不仅仅是方便,而且在大多数虚拟机上效率并不高。所以Java - 至少在某些实现中 - 不会做任何更奇怪的事情。

1

一个HashSet可以被认为是在你不真正关心值的类型,只有某个值是否与特定键相关联的一个HashMap的特殊情况。

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

同样,TreeSet的使用TreeMap的,如果你的钥匙是有序/媲美,因而可以有效实现。

您可以实现在许多其他方面的设置界面,但这些都是典型的。

0

由于HashMap和HashSet的是basicly使用相同的算法,它是简单不执行两次,因此这并不奇怪那几个,如果不是全部,JVM实现做到这一点。 它也适用于LinkedHashMap/Set,TreeMap/Set等。

更一般地,可以通过选择价值为相同为重点,以创建任何地图任何实现的Set实现,或者是一个常量。内存存储的损失可以忽略不计。

顺便说,该JDK提供Collections.newSetFromMap方法,该方法不正是这样的:它由所有的键映射到一个Boolean.TRUEMap<E,Boolean>Set<E>转换。当Map 1没有相应的Set实现时,该实用程序方法非常有用,例如对于ConcurrentHashMap。

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