面试题解1-关于== 和 equals 的区别

问题一:关于== 和 equals 的区别

先来说说 == 运算符,它是java中的一种运算符,用来比较两个对象是否相等,而比较两个对象是否相等的实现原理就是比较两个对象的地址,因为如果两个对象的地址相同的话,那么其实就肯定是同一个对象。

equals是Object类的方法,作用也是比较两个对象,equals的源码如下:

观察源码之后,可以得出结论,在重写equals方法之前,equals的作用和==运算符是相同的

 

 如果想要自行地通过equals比较两个对象的内容,则需要重写equals的方法。

String类中重写的equals方法如下:

 

观察源码后可以发现,String类中的equals方法首先用==运算符检查参数是否为这个对象的引用,如果参数就是该对象的引用的话,那么内容一定是相同的。

之后,使用instanceof操作符检查参数是否为正确的类型,如果类型不相同,不是String类型,那么就没有比较的必要了。检查参数是String类型之后,再检查参数传入对象的属性是否与要比较的对象相同。通过源码可知,将两个String对象从开头到末尾一个一个字符进行比较,如果完全相同返回true,反之,返回false。

对于重写equals方法,需要满足自反性、对称性、传递性、一致性、非空性。

自反性(x.equals(x)必须返回true);

对称性(x.equals(y)返回true时,y.equals(x)也必须返回true);

传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true);

一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值);

非空性(对于任何非null值的引用x,x.equals(null)必须返回false)

重写equals方法不要将方法参数修改为object之外的类型,重写时一定要加上@Override的注解

 

posted @ 2020-06-28 16:37  TidalCoast  阅读(133)  评论(0编辑  收藏  举报