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

这篇具有很好参考价值的文章主要介绍了带你完全掌握== 和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方法,因为有些类中也嵌套着另外一个对象类型文章来源地址https://www.toymoban.com/news/detail-552329.html

到了这里,关于带你完全掌握== 和equals区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA中.equals()与 ==的区别

            “==”是 运算符 ,如果是基本数据类型,则比较 存储的值 ;如果是引用数据类型,则比较 所指向对象的地址值 。         equals是 Object的方法 ,比较的是 所指向的对象的地址值 ,一般情况下,重写之后比较的是 对象的值 。 八大数据类型: 整数 byte、sho

    2024年02月08日
    浏览(38)
  • 【Java扫盲篇】==和equals的区别

    这是一道面试经典题,面试官对你说:小伙子,请你说说 == 和 equals 的区别 对于==来说 如果比较的是基本数据类型,那么==比较的是数据的值是否相同。注意: (与数据类型无关) 如果比较的是引用数据类型,那么==比较的是两个对象的地址是否相同,即两个引用是否指向同

    2024年03月23日
    浏览(32)
  • Java面试题: == 和 equals() 区别,toString方法

    == :运算符 可以使用在基本数据类型变量和引用数据类型变量中 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同) 如果比较的是引用数据类型变量:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体 补充: == 符

    2024年02月08日
    浏览(47)
  • go语言入门-一文带你掌握go语言函数

    本文go语言入门-掌握go语言函数收录于《go语言学习专栏》专栏,此专栏带你从零开始学习go语言。 在每一种编程语言中都有函数的概念,函数是基本的代码快,用于执行一个任务。 我们之前写的函数代码中,都包含一个main函数: 这个 main 就是一个函数的定义,包含了以下几

    2024年02月03日
    浏览(41)
  • 一文带你掌握C语言的分支结构

    在本篇博客文章中,我们将深入探讨C语言中的if语句及其相关用法。if语句是一种用于条件判断的分支语句,它允许我们根据条件的真假来执行不同的代码块。 if语句的基本语法如下所示: 在这个语法结构中,条件是一个布尔表达式,如果条件的值为真(非零),则执行if语

    2024年02月05日
    浏览(52)
  • 一文带你掌握C语言的循环结构

    在C语言中,循环结构是一种重要的控制结构,它允许我们重复执行一段代码,以达到特定的目的。循环结构可以帮助我们简化重复性的任务,提高代码的效率。本篇文章将深入探讨C语言中的循环结构,包括 while 循环、for 循环、do-while 循环以及循环中的控制语句。 while 循环

    2024年02月05日
    浏览(60)
  • Java中==和equals的区别,包装类对比、String和new String

            对于这个问题,我们得了解基本类型和引用类型在内存中的结构,具体如下: 引用对象句柄访问: 引用对象直接指针访问:           可以看出,无论哪种方式访问基本类型和引用类型的实例数据,基本类型的内存上是保存值,而引用类型的内存上是保存指针

    2024年02月11日
    浏览(40)
  • 【C语言初阶】带你轻松掌握指针基础知识(1)——指针的定义,类型,大小

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,这里是君兮_,最近刚回家有点懒,从今天开始恢复更新并开始更新新的刷题系列,我们先继续更新0基础入门C语言的内容,今天给大家带来的是指针方面的内容,但由于是初阶,一些高级的用法我们放在进阶篇再讲

    2024年02月12日
    浏览(43)
  • 一文带你快速掌握爬虫开发中的一些高级调试技巧

      做过爬虫开发的人都知道,浏览器的开发者工具基本是离不开的,有时候在准备开发一个web爬虫的时候,往往最先开始的就是打开浏览器开发者工具进行请求、参数、响应…的分析。用好了确实是可以大大的帮我们提高调试代码的效率! 本文将介绍几个高级的工具使用技

    2024年02月08日
    浏览(57)
  • 6.6---每天一点点--- Java基础之==和equals区别并举例说明(总复习+深入版)---详细+举例(小白也能看懂)

    1.== 为运算符,equal 为String数据类型的比较方法 相同内容的对象地址不一定相同,但相相同地址的对象内容一定相同;== 比较的是值是否相等,equal比较的是是否是同一个对象 2.把对象想象成一个房子,而引用则是门牌号。如果两个引用指向同一个房子,那么它们就是相等的

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包