您的位置:首页 > 职场人生

黑马程序员——equals方法和hashCode方法的问题

2011-12-20 18:23 288 查看
----------------------
android培训、java培训、期待与您交流! ----------------------
在没有看视频是之前自己是给hashCode和equals这两个方法搞的很晕,自己一直在想为什么重写hashCode的时候必须的重写equals方法,现在

看了视频终于真相大白了。

一般复写这两个方法的时候是在对象存进集合的时候。因为在存进集合的时候对象都会自己先生成一个hashCode的值,而在生成hashCode的

时候可能生成一样的hashCode的值(虽然这几机率非常的小但是还是会出现),当出现的hashCode的值一样时,就会在比较这两个对象的equals

方法,若这两个对象的equals也是一样的时候,后面的这个对象便不能放进集合,若是相同就可以放进集合,因为这两个对象不是同一对象

,而这个应该就是在集合中才会使用其他的地方基本很少用到。因为这样比较起来是比较耗时的。hashCode是底层调用的我们要想清楚的看

出就只能通过在hashCode中写输出语句。
public int hashCode()
{
return name.hashCode()+age*37;
为什么这里的age要乘上一个三十七呢,这里的age其实乘以什么都没有关系,就是不要乘以1,因为怕当一个对象(name.hashCode

()+age)的值相加起来会和另外的对象的相等。
}
public boolean equals(Object obj)
{
if(!(obj instanceof XXX))
return false;
XXX xxx = (XXX)obj;
return this.name.equals(xxx.name)&&&
}
补充:

只有类的实例对象要被采用哈希算法进行存储和检索时,这个类才需要按要求覆盖hashCode方法。即使程序可能暂时不会用到当前类的

hashCode方法,所以通常要求hashCode方法和equals方法--并被同时覆盖。

 通常来说一个类的两个实例对象用equals方法比较的结果相等时,他们的哈希吗也必须相等,但反之则不成立,即equals方法比较结果不想

等的对象可以有相同的哈希码或者说哈希码相同的两个对象的equals方法比较的结果可以不想等,例如,字符串"BB"和"Aa"的equals方法比

较的结果肯定是不想等的,但是它们的hashCode方法返回值却相等。

当一个对象被存储进HashSet集合中以后,就不能修改这个对象的那些参与计算哈希值的字段,否则对象修改后的哈希值与最初存储进

HashSet集合中的哈希值就不相等,在这种情况下,即使在contains方法使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返

回找不到对象的结果,这也就回导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。

----------------------
android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息