我在Integer字段周围有两个简单的包装类,我必须覆盖equals()和hashCode()。最后,它们都使用相同的hashCode()算法,因此如果Integer字段相同,则哈希码会发生冲突。
由于对象是不同的类型,这是否重要,或者我是否应该只关心我是否希望将它们作为键混合在同一个HashMap中?
答案 0 :(得分:13)
hashCode()
对于两个对象是相等的说“这些对象是相等的偶然,通过调用equals()
进行仔细研究”。只要这些类的equals()
方法正确,哈希码相同就不是问题。
hashCode()
的一般规则是,如果两个对象相等,则它们的哈希码也应该相等。请注意,规则不是“如果两个对象具有相同的哈希码,那么它们应该相等。”
答案 1 :(得分:1)
如果您可能有一个哈希映射,其中两个类型的对象具有相同的值,那么这显然是潜在的性能问题。 HashMap
等不查看实际的运行时类 - 实际上没有一种标准的方法来判断不同类的两个对象是否相等(例如,List
s与ArrayList
和Arrays.asList
生成的相同顺序的相同值应该相等)。对于HashMap
,我猜测命中不会太糟糕,但可能更糟糕的是,例如,在第一次检查时获得重大收益的探测性实施。