读书人

为啥在重写了equals()方法之后也必须重

发布时间: 2013-03-10 09:38:39 作者: rapoo

为什么在重写了equals()方法之后也必须重写hashCode()方法
class key { int i ; public key(int i) { this.i = i; } @Override public boolean equals(Object obj) { if(obj instanceof key) { if(((key)obj).i == i) return true; } return false; } @Override public int hashCode() { return i; } }

?我们先不要看equals的重写,这里我们重写了hashcode这个方法,让它返回一个我们初始化进去的i,这样你每次new一个对象,因为是通过hashcode找key,而你的hashcode有只是值i,所以只要i相等,你就可以找到你的key的地址,注意,只是找到你要的key的地址,但key是不是同一个key还不一定。然后我们开始比较我们传来的寻找value的key和hashmap中的key是不是同一个key,如果是那就找到了value。

在未重写equals方法我们是继承了object的equals方法,那里的 equals是比较两个对象的内存地址,显然我们new了2个对象内存地址肯定不一样,所以我们还要重写equals这个方法,让重写后的equals方法来比较我们对象里特有的东西。

重写equals方法一般按照如下步骤:
1.先判断这两个比较的对象是不是同个类型,如果类型都不相同,肯定不相同;
2.如果类型相同,我们先要把Object向下转型到我们的类类型,然后比较自己类特有的变量,这里我只是比较了类里i值是否相同,如果相同,则表明两个对象是相同的(只是作为hashmap的key来说是相同的),这样就可拿到hashmap的value了。

总结:
hashmap中value的查找是通过 key 的 hashcode 来查找,所以对自己的对象必须重写 hashcode 通过 hashcode 找到对象后会用 equals 比较你传入的对象和 hashmap 中的 key 对象是否相同,所以要重写 equals.

1、重写equals方法时需要重写hashCode方法,主要是针对Map、Set等集合类型的使用;

a: Map、Set等集合类型存放的对象必须是唯一的;

b: 集合类判断两个对象是否相等,是先判断equals是否相等,如果equals返回TRUE,还要再判断HashCode返回值是否ture,只有两者都返回ture,才认为该两个对象是相等的。

2、由于Object的hashCode返回的是对象的hash值,所以即使equals返回TRUE,集合也可能判定两个对象不等,所以必须重写hashCode方法,以保证当equals返回TRUE时,hashCode也返回Ture,这样才能使得集合中存放的对象唯一。


?

读书人网 >编程

热点推荐