你必须正确地重写方法equals()方法从Object类
编辑:我认为,我的第一反应可能是误解,因为我不是太精确。所以我决定增加更多的解释。
为什么你必须重写equals()?那么,因为这是一个开发人员决定两个对象是否相等意味着什么的领域。大多数情况下参考平等是不够的。
例如,假设您有一个HashMap,其键的类型为Person。每个人都有姓名和地址。现在,你想使用键找到详细的bean。问题是,您通常无法使用与地图中相同的参考创建实例。你所做的是创建Person类的另一个实例。显然,operator ==在这里不起作用,你必须使用equals()。
但现在,我们来到另一个问题。假设您的收藏非常庞大,并且您想要执行搜索。天真的实现将使用equals()将您的关键对象与地图中的每个实例进行比较。然而,这将是非常广泛的。这里是hashCode()。正如其他人所指出的,散列码是一个不必是唯一的单个数字。重要的要求是每当equals()为两个对象赋予true时,hashCode()必须为它们返回相同的值。反意义并不成立,这是一件好事,因为散列码将我们的键分成各种桶。我们在单个桶中有少量的Person类实例。当我们执行搜索时,该算法可以立即跳转到正确的存储桶,并且现在只对每个实例执行等于。因此,hashCode()的实现必须尽可能均匀地在桶中分配对象。
还有一点。一些集合需要在用作关键字的类中正确实现hashCode()方法,这不仅是出于性能原因。这些示例是:HashSet和LinkedHashSet。如果它们不覆盖hashCode(),那么默认的对象 hashCode()方法将允许将您可能认为“有意义的 等于”的多个对象添加到“不允许重复”集合中。
一些使用的hashCode()
- HashSet的藏品
- LinkedHashSet
- HashMap的
看一看Apache的公地这两个类,可以让你实现等于()和hashCode()容易
我做了谷歌,但我发现所有的例子从来没有解释,你不得不重写equals方法。 –
@AndroidAddict:那你为什么不问这个问题? – 2013-04-17 20:18:01