您必须从类 Object 中正确覆盖方法 equals()
编辑:我认为我的第一反应被误解了,可能是因为我不太精确。所以我决定添加更多的解释。
为什么你必须重写equals()?好吧,因为这是在开发人员的领域内决定两个对象相等意味着什么。在大多数情况下,引用相等是不够的。
例如,假设您有一个 HashMap,其键是 Person 类型。每个人都有姓名和地址。现在,您想使用密钥查找详细的 bean。问题是,您通常无法创建具有与地图中的引用相同的引用的实例。您所做的是创建类 Person 的另一个实例。显然,运算符 == 在这里不起作用,您必须使用 equals()。
但是现在,我们遇到了另一个问题。假设您的收藏非常大,并且您想要执行搜索。天真的实现会使用 equals() 将您的关键对象与地图中的每个实例进行比较。然而,这将是非常广泛的。hashCode() 来了。正如其他人指出的那样,哈希码是一个不必唯一的数字。重要的要求是,每当 equals() 为两个对象返回 true 时,hashCode() 必须为这两个对象返回相同的值。反推不成立,这是一件好事,因为哈希码将我们的密钥分成不同的桶。我们在单个存储桶中有少量 Person 类的实例。当我们执行搜索时,算法可以立即跳转到正确的存储桶,现在只对每个实例执行 equals。
还有一点。某些集合需要在用作键的类中正确实现 hashCode() 方法,这不仅是出于性能原因。示例是:HashSet 和 LinkedHashSet。如果它们不覆盖 hashCode(),则默认 Object hashCode() 方法将允许将您可能认为“有意义相等”的多个对象添加到“不允许重复”集合中。
一些使用 hashCode() 的集合
看看 apache commons 中的这两个类,它们可以让你轻松实现 equals() 和 hashCode()