【发布时间】:2014-09-04 17:51:26
【问题描述】:
我正在尝试更深入地了解 java.util.Collection 和 java.util.Map,但我对 HashSet 功能有一些疑问:
在文档中,它说:这个类实现了 Set 接口,由一个哈希表(实际上是一个 HashMap 实例)支持。 好的,所以我可以看到一个 HashSet 总是有一个 Hashtable 工作在背景中。哈希表是一个结构,每次你想向它添加一个新元素时,它都会请求一个键和一个值。然后,将值和键存储在基于键 hashCode 的存储桶中。如果两个键的哈希码相同,则它们使用链表将两个键值添加到同一个桶中。如果我说错了,请纠正我。
所以,我的问题是:如果一个 HashSet 总是有一个 Hashtable 在后台运行,那么每次我们使用 HashSet.add() 方法向 HashSet 添加一个新元素时,HashSet 都应该将它添加到它的内部 Hashtable 中。但是,Hashtable 要求一个值和一个键,那么它使用什么键呢?它是否只是使用我们尝试添加的值作为键,然后获取它的 hashCode?如果我对 HashSet 实现说错了,请纠正我。
我的另一个问题是:一般来说,哪些类可以使用 java 对象的 hashCode() 方法?我问这个是因为,在文档中,它说每次我们覆盖 equals() 方法时,我们都需要覆盖 hashCode() 方法。好的,这确实有道理,但我怀疑这是否只是我们应该做的建议以保持一切“美好和完美”(以这种方式),或者是否真的有必要,因为可能很多 Java 默认类会不断使用对象的 hashCode() 方法。在我看来,我看不到使用此方法的其他类,而不是那些与 Collections 相关的类。非常感谢你们
【问题讨论】:
-
您添加到集合中的“值”实际上是地图的键。
HashSet放入地图的值无关紧要。它实际使用的值是对名为PRESENT的对象的虚拟对象引用。
标签: java hashmap hashcode hashset