Object类中的equals()源码
public boolean equals(Object obj) {
return (this == obj);
}
/*
作用:
指示其他某个对象是否与此对象“相等”
返回值:
boolean类型,如果比较的两个对象“相等”,则返回true,否则返回false
形参:
Object obj,因此可以传递任何对象
this == obj:
“==”
基本数据类型比较的是数值,
引用数据类型比较的是两个对象的地址值,
其中this是哪个对象调用这个方法,谁就是this;
而obj是调用方法形参里面传递进来的对象
*/
重写Object类中的equals()
注意:
1.判断传递的参数是否是this本身,如果是返回true,提高程序效率
2.判断传递的参数是否是null,如果是返回false,提高程序效率
3.在向下转型前去判断类型,防止类型转换异常ClassCastException
//系统生成的重写equals()
@Override
public boolean equals(Object o) {
// 如果调用的对象和传进来的对象是一样的,那么它们一定相等,直接结束方法并返回true
if (this == o) return true;
// 如果传递的对象为null(也避免了空指针异常),
// 或者调用该方法的对象和传递进来的对象的字节码对象不一致(说明它们不是同一个类别的东西),就返回false
if (o == null || getClass() != o.getClass()) return false;
/*
经过上一个if判断,也就已经顺带做了向下转型的安全判断,这里就可以直接安全的进行向下转型了
*/
Cola cola = (Cola) o;
/*
使用 A && B,如果A为false,则直接返回false,不会去判断后续的B部分,提高代码的效率
先判断int类型的数值是否相等,再来判断较为复杂的引用数据类型的数据
其中Objects.equals(a1,a2)的源码为:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
(a == b):判断a和b两个引用数据类型的地址值是否相等,地址值都相等,那他们肯定是同一个东西,就可以直接返回true了
(a != null && a.equals(b)):首先要判断a不为null,再去调用equals方法就可以避免空指针异常的可能性,
equals方法可以比较两个引用数据类型的数值是否相等,如果相等则为true
*/
return code == cola.code &&
Objects.equals(name, cola.name);
}