这道题本身很简单,大部分同学能说出区别,但是在面试的时候,如果每一题都有一个分数的话,大部分同学这道题都拿不到高分,如果你只说==比较的是两个对象的地址,equals可以比较地址也可以比较内容的话,只能拿一个及格的分数,那如何说才能提高本题的分数呢?
首先要说清==是运算符,用来比较两个对象是否相等。Equals是Object类的方法,用于比较两个对象是否相等。 这才是他们直接最大的区别吧?如果把这个和上面的都说出来,你的分数会由60变成70.
我们还要说清==和equals什么时候的作用是相同的。在我们使用的类中,如果没有重写equals方法, 那么equals方法和==的作用就是相同的,因为Object类中equals方法的实现原理就是使用==来实现的。
如果需要比较两个对象的内容,我们需要写equals方法。我们可以参考一下String类中重写的equals方法:
· 使用==操作符检查“参数是否为这个对象的引用”;
· 使用instanceof操作符检查“参数是否为正确的类型”;
· 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;
· 编写完equals方法后,问自己它是否满足对称性、传递性、一致性;
· 不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉@Override注解。
重写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)。
然后再举几个jdk中常见的几个重写了equals的类,说这个可以让面试官知道你有读源码的习惯