一般情况下我们会在面试中被问到equals()和“==”的区别?
通常我们的回答是,equals比较的是对象的内容,而‘==’比较的是对象的地址。这样的回答明显不是一个严谨的答案。
首先,我们应该知道equals是来自Object类的一个public方法,在Object类中,equals的实现如下所示:
public boolean equals(Object obj) {
return (this == obj);
}
由此不难看出,默认的equals()方法,其实和“==”运算符之间没有任何区别。
public class Test {
private int count;
public Test(int count) {
this.count = count;
}
public static void main(String[] args) {
Test t1 = newTest(1);
Test t2 = new Test(1);
System.out.println(t1.equals(t2));
System.out.println(t1 == t2);
}
}
输出:
false
false
由此我们才衍生出重写equals()方法。
在一般我们的业务开发中,我们在一些情况下并不需要两个对象在严格意义上相等,而是仅仅在业务上相等。换而言之,就是比较他们的值相等。这也就回答了我们一开始的问题。
但是需要注意的是,在我们决定重写equals方法之前,应该先重写hashcode()方法。
简单来说,当我们通过equals比较的两个对象相等时,这两个对象返回的hashcode码必须一致。
当我们equals比较的两个对象不相等时,两个对象返回的hashcode码有可能会相等。