重写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); }
运行结果:


浙公网安备 33010602011771号