Java的Object类中的equals方法
本文运用一个Person类来说明Java的Object类中的equals方法
一、重写equals方法前
Person类:
package Demo3;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
main方法:
package Demo3;
public class DemoEquals {
public static void main(String[] args){
/*
Person类默认继承了Object类
public boolean equals(Object obj){
return (this ==obj);
}
参数:
Object obj:可以传递任意的对象
==比较运算发,返回的是一个布尔值 true /false
基本数据类型:比较的是值
引用数据类型:比较的是两个对象的地址值
this是谁?哪个对象调用的方法,方法中的this就是哪个对象:p1调用equals方法所以this就是p1
this ** obj--->p1==p2
*/
Person p1=new Person("鹿晗",18);
Person p2=new Person("李钟硕",19);
System.out.println("p1:"+p1);
System.out.println("p2:"+p2);
boolean b=p1.equals(p2);
System.out.println(b);
p1=p2;
boolean c=p1.equals(p2);
System.out.println(c);
}
}
运行结果:
二、重写equals方法后
Person类:
package Demo3;
import java.util.Objects;
public class Person {
private String name;
private int age;
public Person() {
}
/*
Object类的equals方法,默认比较的是两个对象的地址,没有意义
所以要重写equals方法,比较两个对象的属性
问题:
隐含着一个多态
多态的弊端:无法使用子类特有的内容(属性和方法)
解决:可以使用向下转型(强转)把obj类型转换为Person
*/
//此处重写的equals方法是用快捷键Alt+insert选择equals()+hashcode()自动生成的
@Override
public boolean equals(Object o) {
if (this == o) return true;
//getClass() != o.getClass()使用反射技术判断o是否是Person类型等效于obj instanceof Person
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);//使用objects类的equals方法对两个对象进行比较是防止空指针异常
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
//@Override
// public boolean equals(Object obj) {
// //增加一个判断如果传递的参数是this本身,直接返回true,提高程序效率
// if(obj==this) return true;
// //增加一个判断如果传递的参数是null,直接返回false,提高程序的效率
// if(obj==null)return false;
// //增加一个判断,防止类型转换异常
// if(obj instanceof Person) {
// //使用向下转型,把obj转换为Person类型
// Person p = (Person) obj;
// //比较两个对象的属性,一个对象是this(p1),一个对象是p(obj->p2)
// boolean b = this.name.equals(p.name) && this.age == p.age;
// return b;
// }
// //不是Person类型直接返回false
// return false;
// }
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
main方法:
package Demo3;
import java.util.ArrayList;
public class DemoEquals {
public static void main(String[] args){
/*
Person类默认继承了Object类
public boolean equals(Object obj){
return (this ==obj);
}
参数:
Object obj:可以传递任意的对象
==比较运算发,返回的是一个布尔值 true /false
基本数据类型:比较的是值
引用数据类型:比较的是两个对象的地址值
this是谁?哪个对象调用的方法,方法中的this就是哪个对象:p1调用equals方法所以this就是p1
this ** obj--->p1==p2
*/
Person p1=new Person("鹿晗",18);
Person p2=new Person("李钟硕",19);
System.out.println("p1:"+p1);
System.out.println("p2:"+p2);
boolean b=p1.equals(p2);
System.out.println(b);
System.out.println("---------------------------");
p1=p2;
boolean c=p1.equals(p2);
System.out.println(c);
System.out.println("------------------------------");
ArrayList<String> list=new ArrayList<>();
boolean d=p1.equals(list);
System.out.println(d);
}
}
运行结果: