【Java扫盲篇】==和equals的区别

这篇具有很好参考价值的文章主要介绍了【Java扫盲篇】==和equals的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这是一道面试经典题,面试官对你说:小伙子,请你说说==equals的区别

==

对于==来说

  • 如果比较的是基本数据类型,那么==比较的是数据的值是否相同。注意:(与数据类型无关)
        int a = 10;
        int b = 10;
        System.out.println(a==b);//结果为true
        int c = 10;
        float d = 10;
        System.out.println(c == d);//结果为true
  • 如果比较的是引用数据类型,那么==比较的是两个对象的地址是否相同,即两个引用是否指向同一块地址
        String s1 = "hello world";
        String s2 = "xiaoguo";
        System.out.println(s1 == s2); //结果为flase
        String s3 = "tyut";
        String s4 = "tyut";
        System.out.println(s3 == s4);//结果为true
class Student{
    public int age;
    public String name;
    public  Student(int age,String name){
        this.age = age;
        this.name = name;
    }
    public static void main(String[] args) {
        Student student1 = new Student(18,"张三");
        Student student2 = new Student(18,"张三");
        System.out.println(student1 == student2);//结果为false
    }
}

明明student1 和 student2的内容相同,为什么结果却是false呢?

这是因为在堆中,会为每一个对象分配内存地址值,此时student1和student2指向不同的地址值,结果就为flase了
那你肯定有疑问,为什么s3和s4结果就为true呢?因为Java虚拟机中,字符串常量是共享的,在拥有“tuyt”的情况下,再创建s4时,就不需要再创建新的对象指向“tyut”,而是和s3一样,指向同一个地址值,所以结果为true

equals

如果类中重写了equals方法,其比较的是存放的内容是否相等
String、Date、File、包装类都重写了Object类的equals方法。

注意:
如果类中没有重写equals方法,比较地址值是否相等(是否指向同一个地址值)。

        String s1 = "hello xiaohua";
        String s2 = "hello xiaohua";
        System.out.println(s1.equals(s2));//结果为true

这是为什么呢?这是因为String重写了equals方法

public boolean equals(Object anObject) {
        if (this == anObject) {
        //这里的==是判断地址,如果地址相同那么肯定内容就相同
        //但内容相同,地址不一定相同哦,
        //因为完全有可能将多个内容相同的字符串存放到不能的位置
            return true;
        }
        if (anObject instanceof String) {
        //这里就是简单枯燥的一个字符一个字符比较
        //如果不是String类型,会被强转成String类型
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

再看下一个例子,请你给出判断结果

   public static void main(String[] args) {
        Student student1 = new Student(18,"张三");
        Student student2 = new Student(18,"张三");
        System.out.println(student1.equals(student2));
    }

结果为false,这又是为什么呢?
首先我们要复习一个知识,Java所有的类的父类都是Object类,自定义的Student类也是如此。
这时你是否恍然大悟,是时候该到Object的源码里查找equals方法了
【Java扫盲篇】==和equals的区别,Java学习成长记,java,开发语言
此时我们找到Objec类,找到equals方法,可以看到equals方法底层是通过==来进行判断的。
那为什么String进行比较结果就是true呢?还记得前面提到过String、Date、File、包装类都重写了Object类的equals方法。
既然这样,当我们想要判断里面存放的内容相同时,就要重写equals方法了。

  public boolean equals(Object obj) {
       if (this == obj){
           return true;
       }
       if (obj instanceof Student){
           Student stu = (Student) obj;
           return this.age == stu.age && this.name.equals(stu.name);
       }
        return false;
    }

再次运行结果为true
那么每次都要手写吗?
当然不是,idea提供了快捷键,可以一键重写方法

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

alt+insert (或者右键)然后选择equals()and hashsCode()
之后一路next就可以了

【Java扫盲篇】==和equals的区别,Java学习成长记,java,开发语言

以上就是本文所有内容,如果对你有帮助的话,点赞收藏支持一下吧!文章来源地址https://www.toymoban.com/news/detail-842679.html

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

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

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

相关文章

  • Java面试题: == 和 equals() 区别,toString方法

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

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

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

    2024年02月11日
    浏览(41)
  • 【Java扫盲篇】String、String Buffer和String Builder的区别

    你在面试时,面试官让你讲讲 String String Buffer String Builde r的区别,你是否能流畅的、完整的叙述出他们三者的区别? 相同点: 他们的底层都是由char数组实现的。 不同点: String对象一旦创建,是不能修改的,如果要修改,会重新开辟空间来存储修改后的对象;而String Buffer和

    2024年04月22日
    浏览(38)
  • JAVA开发(JAVA架构师成长之路)

    从一个最基础的JAVA开发人员成为JAVA架构师,需要经历8层能力的进阶。 第一阶段:熟悉JAVA基础语法,学会写各种if else和流程语句,熟练使用各种数据类型,集合。能依葫芦画瓢,模仿别人的代码结构,新增类,修改类的信息和逻辑。这个阶段大概是一年的经验。 第二阶段:

    2024年02月09日
    浏览(42)
  • 【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

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

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

    2024年02月08日
    浏览(43)
  • 告别过去,拥抱未来:一个Java开发者的成长之路

    时光飞逝,不知不觉已经到了大四毕业的时候。回顾这四年的学生生涯,Java开发是让我最为热爱和投入的一部分。在这里,我想和大家分享我在Java开发方面的收获、经验和感悟,同时也向过去的自己告别,迎接未来的挑战。 在大一的时候,我们学习了Java编程基础,当时我并

    2024年02月08日
    浏览(61)
  • 猿创征文|我Java开发那些年陪我成长的工具清单

    📓推荐网站(不断完善中):个人博客 📌个人主页:个人主页 👉相关专栏:CSDN专栏 🏝立志赚钱,干活想躺,瞎分享的摸鱼工程师一枚 本摸鱼程序员也是历经软件专业的四年历程,想在校时期到如经也有几载光阴,不得不说从刚参与到工作中的一脸茫然到现在学会寻找让自

    2024年02月03日
    浏览(62)
  • Java开发手册中为什么禁止使用BigDecimal的equals方法做等值比较已经为什么禁止使用double直接构造BigDecimal

    阿里Java开发手册嵩山版中明确指出: 1、BigDecimal的等值比较应使用compareTo()方法,而不是equals()方法 equals()方法会比较值和精度(1.0与1.00返回结果为false),而compareTo()则会忽略精度 2、禁止使用构造方法BigDecimal(double)的方式把double值转换为BigDecimal对象 BigDecimal(double)存在精度损

    2024年02月07日
    浏览(55)
  • Java转Go:java开发者转学go语言,请给我一些建议和学习推荐

    在做开发时遇到最无理的需求就是部门没了😂 遇到最无理的需求就是部门没了😂,差点人也在这个公司没了,但好在是跟着大部队换了一个部门,就是要转go,也可能要用js和solidity开发 一开始知道部门没了,第一时间一定是会担心,甚至后面知道有的同事要被毕业,有的同

    2024年02月13日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包