`

何时有必要重写equals()和hashCode()

    博客分类:
  • Java
阅读更多

当你要重写对象的equals方法时,你必须重写该对象的hashcode方法.
两个对象之间要互相equals的话,就必有具备相同的hashcode.

Set的存储机制是equals与hashcode相结合的。一般ADD一个对象会先根据equals方法判断与其他对象是否相等,因为Set是不允许重复add的。如你不覆盖equals方法,JAVA默认所有的对象都是不同的,也就是它们的内存地址。假如你NEW一个对象,人,你认为只要它们名字相同就是同一个对象,此时你就需要覆盖equals方法了,否则同名也是两个对象。java先通过equals方法判断存储位置,如果不同直接存入;如果通过equals方法比较现在要存入的对象与结合中的某个对象相等,那么它就会再根据hashcode来判断它们是否hashcode也相等,如果相等那就存不进去了,说明它们确实是同一个对象,不等就可存入。所以一般在写程序的时候,两个对象你认为它们不同就去覆盖equals方法。这样可以提高效率,不要让JAVA再去判断hashcode

一般你需要比较两个对象是否相等时需重写equals方法,一般在编写领域和实体对象时需重写equeals和hashCode

但什么时候应该重写呢?
比如:你向 Set 集合中添加一个一个Person 对象 如果 这个Person 对象的
name 相同就认为是同一个对象的话。那么你就必须同时重写 hashCode,和equals 方法。
Set 集合是不可以包含重复元素的  
Person p1 = new Person("abc");
Person p2 = new Person("abc");
p1 ,p2 加到Set 集合中 会是两个对象。
但事实上是 同一个人。
这时就必须重写。

equeals和hashCode方法有必然联系吗?
----
在Java的规范中规定了有必然的联系, 即 如果 a.equals(b),那么必定有 a.hashCode() == b.hashCode(),反之【不一定成立】
如果不满足这个条件则map, set等的处理会出现错误的
这是一个规范。

原文地址:http://topic.csdn.net/u/20080421/17/51b2a8e6-e057-4694-a6e3-880d6fe55367.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics