欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

重写equals所要遵守的约定

发布时间:2025/6/17 编程问答 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 重写equals所要遵守的约定 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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方法。

转载于:https://blog.51cto.com/13919712/2284385

总结

以上是生活随笔为你收集整理的重写equals所要遵守的约定的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。