我正在尝试更深入地了解java.util.Collection和java.util.Map,但是我对HashSet的功能有些疑问:
在文档中,它说:该类实现了Set接口,由哈希表(实际上是HashMap实例)支持。好的,所以我可以看到HashSet始终有一个Hashtable在后台工作。 Hashtable是一种结构,每当您想要向其中添加新元素时都会请求一个键和一个值。然后,根据键hashCode将值和键存储在一个桶中。如果两个键的hashcode相同,则会将两个键值添加到同一个桶中,使用链接列表。如果我说错了,请纠正我。
因此,我的问题是:如果HashSet始终具有在后台运行的Hashtable,那么每次我们使用HashSet.add()方法向HashSet添加新元素时,HashSet都应将其添加到其内部Hashtable中。但是,Hashtable要求一个值和一个键,那么它使用哪个键呢?它是否只使用我们尝试添加的值作为键,然后获取其hashCode?请纠正我有关HashSet实现的错误描述。
我另外一个问题是:通常哪些类可以使用java对象的hashCode()方法?我之所以问这个问题,是因为在文档中指出每次我们重写equals()方法时都需要重写hashCode()方法。好的,这确实是有道理的,但我的疑问是是否只是建议我们这样做以保持一切“良好和完美”(用这种方式表达),还是真的必要,因为可能许多Java默认类将经常使用您的对象的hashCode()方法。在我的看法中,除了与集合相关的那些类之外,我看不到其他类使用此方法。非常感谢大家。
HashSet
放入映射中的值是无关紧要的。它实际使用的值是一个名为PRESENT
的对象的虚拟对象引用。 - ajb