带你完全掌握== 和equals区别

首先说一下==和equals之间的区别:

== 如果比较的是基本数据类型 则比较的是其中的值,如果比较的是对象的话,比较的是其中的内存地址,看个案例:

public class MyTime {
    private int year;
    private int month;
    private int day;

    public MyTime() {
    }

    public MyTime(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }
}
public class MyTimeTest {  
public static void main(String[] args) {
        //== 如果比较基本数据类型的话 是比较其值 所以这里是true 10==10
        int a =10;
        int b =10;
        System.out.println(a==b);//true


        /**
        *比较对象的话 比较的是其内存地址
        *明显可以看出 两个对象的内存地址不相等
        */
        //test.equals.MyTime@2f0e140b
        MyTime myTime1 =new MyTime(2023,7,12);
        //test.equals.MyTime@7440e464
        MyTime myTime2 =new MyTime(2023,7,12);

         System.out.println(myTime1 == myTime2);//false
    }
}

可以看出基本数据类型是可以使用==进行判断是否相等,引用数据类型则不能,那应该怎么办呢?

这个时候 我们要使用equals方法进行比较对象是否相等,下面来看看:

public class MyTimeTest {  
public static void main(String[] args) {
        //== 如果比较基本数据类型的话 是比较其值 所以这里是true 10==10
        int a =10;
        int b =10;
        System.out.println(a==b);//true


        /**
        *比较对象的话 比较的是其内存地址
        *明显可以看出 两个对象的内存地址不相等
        */
        //test.equals.MyTime@2f0e140b
        MyTime myTime1 =new MyTime(2023,7,12);
        //test.equals.MyTime@7440e464
        MyTime myTime2 =new MyTime(2023,7,12);

        System.out.println(myTime1 == myTime2);//false

        
         //使用equals进行两个对象的比较
        System.out.println("猜猜我是什么: "+myTime1.equals(myTime2));//false
    }
}

通过测试,使用equals进行对象比较是否相等,发现仍然还是false,使用equals方法也不行吗,这个时候可以看看equals的源码:

   public boolean equals(Object obj) {
        return (this == obj);
    }

可以看出equals的源码还是用==判断两个对象是否相等,显然是不行的,前面说了,如果==比较的是对象的话,比较的是其内存地址,显然创建了两个对象,内存地址明显不相等,那怎么办呢?

这个时候就需要重写equals方法,进行判断了:

package test.equals;


public class MyTime {
    private int year;
    private int month;
    private int day;

    public MyTime() {
    }

    public MyTime(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    @Override
    public boolean  equals(Object obj) {
        //在传递值进来的时候,有可能传递的是null对象进行比较          
        //同时也有可能传递的类型不是MyTime类,不能进行比较
        //所以要使用instanceof关键字判断传递的obj是不是MyTime类
        if (obj ==null||!(obj instanceof MyTime) ){
            return false;
        }

        //如果是同一个对象那么一定是相等 例如myTime1.equals(myTime1),不需要判断都是相等的
        if (this==obj){
            return true;
        }


        //如果以上都不满足说明其传递的是正确的对象类型
        //在这里说明 如果成员变量是包装引用类型使用equals比较值,底层重写了equals
        //如果是基本数据类型比较使用==就行

        //父类没有MyTime的属性 需要强制类型转换,多态的体现
       
        MyTime myTime = (MyTime) obj;
        return this.year == myTime.year && this.month == myTime.month &&  this.day == myTime.day;
    }
}

看图中的注释我相信你应该懂了

建议以后我们在写类的时候 如果需要使用到equals比较对象其中的值,每个类都可以重写equals方法,因为有些类中也嵌套着另外一个对象类型

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cra风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值