我有一个包含A类元素的LinkedList。 我需要检查列表是否包含基于某些标准的元素。
是否足以覆盖A类中的.equals方法,或者我是否还需要覆盖哈希方法?
答案 0 :(得分:2)
当您的Object将用于使用哈希的数据结构时,您需要覆盖hashCode()方法。 HashMap,HashSet等
没有什么可以说必须实现hashCode()函数。许多数据结构只使用equals()方法,而不是hashCode()函数,所以你可以不用它来实现它。
但你真的可以保证没有人会把它放到另一个使用hashCode()函数的数据结构中,所以从一开始就实现它可能是个好习惯。 / p>
答案 1 :(得分:1)
您不必覆盖hashCode,但是相等的对象应该具有相同的哈希码。我的建议:如果你使用eclipse,右击该类,转到source,生成equals()和hashcode(),并选择必须相等的变量。这是最简单的方法。
答案 2 :(得分:1)
equals()
方法只应用于说明对象的身份。
如果用于查找您要查找的对象的条件与用于定义对象标识的对象完全匹配,则可以调用List
' s { {1}}方法,它依赖于contains()
。
在任何其他情况下,您应该循环遍历列表并执行手动比较。或者,您可以使用Java8 Streams,它提供过滤功能。
答案 3 :(得分:0)
您必须意识到,通过实现equals
方法,您将定义等价关系,即将此类的所有对象细分为等价类的关系。当有许多对象满足您的标准时,它们都将被视为相等,并且它们都必须具有相同的hashCode。因此,当您在某个时刻将这些对象放在HashMap中时,所有这些对象最终会出现在同一个槽中,从而导致退化的HashMap表现不佳。
即使您不打算将对象放在HashMap中,这似乎也是反对根据更广泛的标准实施equals
进行比较的强有力论据。
你必须确保你的实现满足等价的接触,也就是说,它必须是自反的,对称的和传递的。约书亚布洛赫的标准书“Effective Java”有详细解释。
每当您实施hashCode
时,必须实施equals
,因为每两个相等的对象必须具有相同的哈希码(请参阅this post详细解释)。