重写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);
    }
复制代码

运行结果:

 

 

posted @   monkey大佬  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示