码迷,mamicode.com
首页 > 其他好文 > 详细

重写equals所要遵守的约定

时间:2018-09-25 01:20:14      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:reac   ref   根据   期望   key   shc   one   his   nal   

1.自反性
对于任何非null的引用的值x;x.equals(x);必须返回的是true
2.对称性
对于任何非null的引用值x和y,当且仅当x.equals(y)为true的时候,y.equals(x)也必须返回true
3.传递性
对于任何非null的引用值想x,y,z,当且仅当x.equals(y);为true ;y.equals(z)的时候
x.eqauls(z)也必须为true
4.一致性
对于任何非null的引用值x和y,只要equals的比较操作在对象中的所有的信息都没有被修改,多次调用x.equals(y)就会一致的返回true;或者一致的返回false;
5,

最终要的一点是在重写equals的时候必须要重写hashcode
如果两个对象根据equals方法比较是相等的,那么调用这两个对象中任意一个对象的hashcode方法都必须产生同样的整数结果。如果调用eqauls方法去比较两个对象,如果两个对象是不相等的,则不一定产生不同的hashcode.

就有如下的例子

public final class PhoneNumber{
private final short areaCode;

private final short prefix;

private final short lineNumber;

public PhoneNumber(int areaCode,int prefix,int lineNumber){

this.areaCode=areaCode;
this.prefix=prefix;
this.lineNumber=lineNumber;

}

}

实例化 PhoneNumber t1=new PhoneNumber(2,3,4);
PhoneNumber t2=new PhoneNumber(2,3,4);
将ti作为key存储如下:
map.put(t1,"jack");
再用t2去取数据的时候,我们期望得到的数据为jack,但是实际我们得到的是null;这是为什么呢?
因为PhoneNumber 没有重写hashCode 方法,就两个相同的对象产生了不同的hashcode,而在get的时候我们根据t2所在散列桶中去找之前的数据,当然是找不到的,put的数据在t1,所在的散列桶中,所以用t2去找的时候当然为null;
因此在重写equals的时候必须重写hashcode方法。

重写equals所要遵守的约定

标签:reac   ref   根据   期望   key   shc   one   his   nal   

原文地址:http://blog.51cto.com/13919712/2284385

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!