先举一个例子:
也可以说是详解了!(划重点,要考!)
package Demo2;
import java.util.Objects;
public class Demo {
public static void main(String[] args) {
Person p = null;
Person p1 = new Person();
System.out.println(p.equals(p1));
/*错误,报空指针异常NullPointerException
原因: p的引用地址为空,根本就不能调用equals方法,显示空指针异常
*/
System.out.println(Objects.equals(p,p1));
/* 正确。
Objects.equals(p,p1)方法,的源代码如下:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
重点:||右侧:先判断第一个数是否为空,如果为空则直接返回false ,
如果不能空,则调用equals方法,继续判断。
}
*/
}
}
package Demo2;
import java.util.Objects;
public class Person {
String name;
//重写的equals方法用来比较对象中的内容,不重写equals则采用隐藏的默认equals方法,来比较引用对象的地址。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name);
}
}
下面是更深一层的解析了:
在这里不重复写Person类了,上面有。
package Demo2;
public class Test1 {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = null;
Person p2 = new Person();
p2.name = "王五";
System.out.println(p1.equals(p2)); //false
/*为什么返回false
原因:首先p1是不为空的,能调用equals方法
重写的equals方法比较的是内容(在这里是比较name里面的内容)
看重写的equals方法最后一行是这样写的:
return Objects.equals(name, person.name);
重新调用了Objects.equals方法:即便p1.name的引用地址为空,
他也能进行比较,大不了直接返回false,不继续判断后面的内容了。
如果p1.name = "王五",这个引用地址是不为空的,而且指向同一个
字符串常量池的存储位置,则他们两内容相同!
*/
}
}