为什么它像内部散列集只使用散列映射?这与表演有关吗?散列集内部可以使用其他集合而不是散列映射
2
A
回答
0
不仅仅是方便,而且在大多数虚拟机上效率并不高。所以Java - 至少在某些实现中 - 不会做任何更奇怪的事情。
1
一个HashSet可以被认为是在你不真正关心值的类型,只有某个值是否与特定键相关联的一个HashMap的特殊情况。
因此,只实施一个在另一个之上是有意义的。 如果您的密钥类型具有良好的散列函数,则HashMap是一个不错的选择。
同样,TreeSet的使用TreeMap的,如果你的钥匙是有序/媲美,因而可以有效实现。
您可以实现在许多其他方面的设置界面,但这些都是典型的。
0
由于HashMap和HashSet的是basicly使用相同的算法,它是简单不执行两次,因此这并不奇怪那几个,如果不是全部,JVM实现做到这一点。 它也适用于LinkedHashMap/Set,TreeMap/Set等。
更一般地,可以通过选择价值为相同为重点,以创建任何地图任何实现的Set实现,或者是一个常量。内存存储的损失可以忽略不计。
顺便说,该JDK提供Collections.newSetFromMap
方法,该方法不正是这样的:它由所有的键映射到一个Boolean.TRUE
Map<E,Boolean>
成Set<E>
转换。当Map 1没有相应的Set
实现时,该实用程序方法非常有用,例如对于ConcurrentHashMap。
相反,创建从Set
一个Map实现,也是可行的,尽管它稍微困难一些。
相关问题
- 1. 使用其他散列构造散列
- 2. 集合的增量散列
- 3. 为什么Python集不可散列?
- 4. 为有序集合组合散列
- 5. Perl:使用引用有其他散列
- 6. 如何从两个散列创建单个散列,其中一个散列的值是另一个散列的键子集的子集?
- 7. 使用功能散列的群集
- 8. 散列集的浅拷贝
- 9. 如何比较单个哈希映射的值,而不使用其他集合
- 10. 使用LINQ映射集合
- 11. Android实现包含另一个散列映射的包含散列映射的可包含对象
- 12. 使用映射突变可变集合?
- 13. 是否可以使用EF4.x映射值对象的集合?
- 14. 何时使用分布式散列表而不是“传统”散列表?
- 15. 从嵌套散列映射检索值
- 16. 持久散列映射,并发JDBM
- 17. java的散列映射查询
- 18. 映射,通过密钥的散列/值
- 19. 爪哇散列映射方法。放()
- 20. 返回嵌套散列映射
- 21. 散列集和数组列表性能
- 22. 集合映射
- 23. 基于路径的基于有界散列集的无限散列集
- 24. 是否更改散列内的散列不更新第一个?
- 25. 在JPA Hibernate映射队列集合
- 26. 要使用哪个集合类:散列表或字典?
- 27. 在动态数据集上使用局部敏感散列
- 28. 修改在Perl的散列内散列
- 29. RestKit映射错误“无法将对象集合映射到不可变集合。”
- 30. terraform可以使用可变散列或映射或映射在.tf文件中创建数据条目吗?
不,这是因为名称。如果它使用了别的东西,它不会被称为'HashSet'。 – Henry