首页 > 其他 > 详细

重写equals所要遵守的约定

时间:2018-09-25 01:02:55      阅读:154      评论:0      收藏:0      [点我收藏+]
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所要遵守的约定

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!