当前位置: 首页 > news >正文

你真的知道 == 和 equals 的区别吗?

让我们每天都有进步,老王带你打造最全的 Java 面试清单,认真把一件事做到极致。

在 Java 中 == 和 equals 的区别,感觉只有很少的人能才完全说正确。

常见的错误回答就是:== 基础类型对比的是值是否相同,引用类型对比的是引用是否相同;而 equals 则是比较的值是否相同。

至于为什么说它是错的,看完本文对 == 和 equals 的解读,你就知道了。

1、== 解读

对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

  • 基本类型:比较的是值是否相同;
  • 引用类型:比较的是引用是否相同;

代码示例:

String x = "string";
String y = "string";
String z = new String("string");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true

代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

2、equals 解读

equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。

首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:

class Cat {
    public Cat(String name) {
        this.name = name;
    }

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Cat c1 = new Cat("王磊");
Cat c2 = new Cat("王磊");
System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

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

原来 equals 本质上就是 ==。

那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:

String s1 = new String("老王");
String s2 = new String("老王");
System.out.println(s1.equals(s2)); // true

同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof 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;
}

原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。

3、总结

总体来说,== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

扫描下方二维码,关注更多动态:

系列文章推荐:

Java 最常见的 200+ 面试题

程序员精美简历Top榜—面试必备

你真的懂 == 和 equals 的区别吗?

相关文章:

  • 关于错误提示:此实现不是 Windows 平台 FIPS 验证的加密算法的一部分的解决方案...
  • 【c++进阶:c++ algorithm的常用函数】
  • (转) RFS+AutoItLibrary测试web对话框
  • 刚刚接触python的感想
  • linux下使用hiredis异步API实现sub/pub消息订阅和发布的功能
  • 第70届(2019)IMO中国国家队选拔考试试题
  • xml编码格式在tomcat下运行出错,eclipse里面直接运行没有问题
  • 微服务架构 SpringCloud(二)Eureka(服务注册和服务发现基础篇)
  • Android图片缓存之Glide进阶
  • css(二):高度与文档流,line-box与box,宽度,position与
  • SQL Server2005作业执行失败的解决办法
  • 进度条14
  • 阿里云RDS PostgreSQL GPU加速规格(支持GIS时空加速)发布
  • 怎么隐藏MathType标尺
  • 用Python监听邻居家小姐姐的上网行为
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Git初体验
  • HTTP--网络协议分层,http历史(二)
  • javascript数组去重/查找/插入/删除
  • JS基础之数据类型、对象、原型、原型链、继承
  • Less 日常用法
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Sass 快速入门教程
  • Terraform入门 - 3. 变更基础设施
  • Vue实战(四)登录/注册页的实现
  • 今年的LC3大会没了?
  • 前端路由实现-history
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 世界上最简单的无等待算法(getAndIncrement)
  • 说说动画卡顿的解决方案
  • const的用法,特别是用在函数前面与后面的区别
  • Mac 上flink的安装与启动
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 积累各种好的链接
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​学习一下,什么是预包装食品?​
  • (1)Android开发优化---------UI优化
  • (C++)八皇后问题
  • (二)springcloud实战之config配置中心
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (原)Matlab的svmtrain和svmclassify
  • (原)本想说脏话,奈何已放下
  • **PHP分步表单提交思路(分页表单提交)
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET Project Open Day(2011.11.13)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • @hook扩展分析
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [.NET]桃源网络硬盘 v7.4
  • [Android] Amazon 的 android 音视频开发文档
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [C\C++]读入优化【技巧】
  • [CakePHP] 在Controller中使用Helper