重写Object类的equals方法以及Objects类的equals方法
重写Object类的equals方法
Object类的equals方法默认比较的是两个对象的地址值,没有意义,所以我们需要重写equals方法,比较两个对象的属性值name,age()
对象的属性值一样好,返回true;否则返回false
问题:
隐含着一个多态
Object obj = pa = new Person("古力娜扎",18);
多态弊端:无法使用子类特有的内容(属性,方法)
解决:可以使用向下转型(强转)把Object类型转换为Person
package com.practice_02.demg_01; import java.util.Objects; public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } // @Override // public String toString() { // return "Person{" + // "name='" + name + '\'' + // ", age=" + age + // '}'; // } //重写equals @Override public boolean equals(Object obj) { if (obj instanceof Person){ //向下转型(强转) Person p = (Person)obj; boolean b = this.name.equals(p.name) && this.age==p.age; return b; } return false; } @Override public int hashCode() { return Objects.hash(name, 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; } }
public static void main(String[] args) { Person p1 = new Person("迪丽热巴",20); Person p2 = new Person("迪丽热巴",20); boolean equals = p1.equals(p2);//比较地址值 System.out.println(equals); }
运行结果:
因为引用数据类型的默认值为null,如果我们使用equals传递的是null
public class demg_01 { public static void main(String[] args) { Person p1 = new Person("迪丽热巴",20); Person p2 = new Person("迪丽热巴",20); boolean equals = p1.equals(null);//比较地址值 System.out.println(equals); } }
我们可以在equals添加判断传递的值是否为空
@Override public boolean equals(Object obj) { //增加一个判断,传递参数obj是null,直接返回false。提高程序的效率 if (obj == null){ return false; } //增加判断 是Person类型在转换,防止类型异常转换异常 if (obj instanceof Person){ //向下转型(强转) Person p = (Person)obj; //比较两个对象属性;一个是调用方法的this(p1),一个就是p(obj=p2) boolean b = this.name.equals(p.name) && this.age==p.age; return b; } return false; }
如果传递的值为空就不需要继续走下面的程序了 ,直接返回false
如果我们使用equals传递的是对象本身,那么就不要执行强转的if判断,可以直接返回true
public boolean equals(Object obj) { //增加一个判断,传递的参数obj是this本身,直接返回true,提高程序效率 if (obj ==this){ return true; } //增加一个判断,传递参数obj是null,直接返回false。提高程序的效率 if (obj == null){ return false; } //增加判断 是Person类型在转换,防止类型异常转换异常 if (obj instanceof Person){ //向下转型(强转) Person p = (Person)obj; //比较两个对象属性;一个是调用方法的this(p1),一个就是p(obj=p2) boolean b = this.name.equals(p.name) && this.age==p.age; return b; } return false; }
Objects类的equals方法
Objects类的equals方法:对两个对象进行比较,防止空指针异常
public static void main(String[] args) { String a1 = "abc"; String a2 = "abc"; boolean equals = a1.equals(a2); System.out.println(equals); }
运行结果:
public static void main(String[] args) { String a1 = null; String a2 = "abc"; boolean equals = a1.equals(a2); System.out.println(equals); }
运行结果:
这个时候我们就用到了Objects中的equals方法
public static void main(String[] args) { String a1 = null; String a2 = "abc"; // boolean equals = a1.equals(a2); // System.out.println(equals); boolean equals1 = Objects.equals(a1, a2); System.out.println(equals1); }
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本