首先看下equals()方法源码:
public boolean equals(Object obj) {
return (this == obj);
}
通过源码可以看出,equals()方法比较的是两个对象的内存引用,通过下面的例子更可以直观看出。
package com.lr.base;
/**
* Created by ALTERUI on 2019/4/18 18:22
*/
public class MyEquals {
public static void main(String[] args) {
Person p1= new Person("lr");
Person p2 = new Person("lr");
System.out.println(p1 == p2);
System.out.println(p1.equals(p2));
}
}
class Person{
private String name;
public Person(String name) {
this.name = name;
}
}
输出结果为:
false
false
这样可以得到,如果不重写equals()方法,eqauls()和“==”等价。那么我们重写Person类的equals()方法,让名字相同的两个对象相等。
class Person{
private String name;
public Person(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Person) {//此时的obj相当于p2
Person person = (Person) obj;
return name == person.name; //比较p1和p2的名字是否相等
}
return false;
}
}
这样的输出结果就为true了。
总结: 再没有重写equals()方法之前,equal()方法等价于“==”都是比较对象的内存地址。我们可以重写equals()方法,按照自己的方式比较,比如String类的equal()方法比较的不再是内存地址,而是字符序列。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}