== 和 equals 的区别是什么?

== 解读

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

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

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

代码示例:

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。

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 方法,把引用比较改成了值比较。

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


往期精彩回顾

《Java 最常见的 200+ 面试题目》

《面试经验分享|精华版》

《程序员专属简历合集》

90% 的人都会答错的面试题 == 和 equals 的区别相关推荐

  1. 支付宝二面:使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!

    不知道从何时起,传出了这么一句话:Java中使用try catch 会严重影响性能. 然而,事实真的如此么?我们对try catch 应该畏之如猛虎么? 一.JVM 异常处理逻辑 Java 程序中显式 ...

  2. 面试官:为什么要尽量避免使用 IN 和 NOT IN?大部分人都会答错!

    作者:Hydor 来源:https://www.cnblogs.com/hydor/p/5391556.html WHY? IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢? 1.效率低 ...

  3. java一个类多次加载_据说99.99%的人都会答错的类加载问题

    概述 首先还是把问题抛给大家,这个问题也是我厂同学在做一个性能分析产品的时候碰到的一个问题. 同一个类加载器对象是否可以加载同一个类文件多次并且得到多个Class对象而都可以被java层使用吗? 请仔 ...

  4. 如果要存 IP 地址,用什么数据类型比较好?大部人都会答错!

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/mhmyqn/article/details/48653157 在看高性能MySQL第3版(4.1 ...

  5. 据说有99%的人都会做错的面试题

    这道题主要考察了面试者对浮点数存储格式的理解.另外,请不要讨论该题本身是否有意义之类的话题.本题只为了测试面试者相关的知识是否掌握,题目本身并没有实际的意义. 下面有6个浮点类型变量,其中前三个是fl ...

  6. 90%的人都做错的用户画像,到底应该怎么做?

    前几天,有个搞运营的小伙伴向我吐槽,熬了几个夜做出来的用户画像被老板说垃圾.不管是市场人员.运营人员还是产品经理,都躲不开"用户画像",但经常听到伙伴们抱怨,这个词太大了,根本不知 ...

  7. 德国80%的统计学教授都会答错的6个与P值有关的问题!

    欢迎关注"R语言和统计"~~ 在2022年的第2天,小编阅读了一篇发表于2002年关于P值的一项问卷调查研究 [1],作者在6所德国大学中邀请了3组不同的受试者,分别为: 心理学专 ...

  8. 支付宝二面:使用 try-catch 捕获异常会影响性能吗?90%都会答错

    不知道从何时起,传出了这么一句话:Java中使用try catch 会严重影响性能. 然而,事实真的如此么?我们对try catch 应该畏之如猛虎么? 一.JVM 异常处理逻辑 Java 程序中显示 ...

  9. 99%的人都会用错或者不会看的N折验证

    做实际比赛和机器学习项目, 很多朋友都会经常遇到线下线上不一致的情况,排除一些特殊的情况,例如问题没法预测,不存在潜在pattern的情况等,我敢说99%的人都不会看N折验证的结果. 没错,是真的! ...

最新文章

  1. BZOJ4766: 文艺计算姬
  2. java 面试题之银行业务系统
  3. 函数 —— fork()将运行着的程序分成2个(几乎)完全一样的进程
  4. 数据结构与算法总结——背包问题与组和问题
  5. 微信小程序之scroll-view-导航栏左右滑动
  6. gRaphael——JavaScript 矢量图表库:两行代码实现精美图表
  7. linux 多线程实现倒计时,Linux用脚本实现“时分秒“倒计时功能
  8. 导入BaiduMapSdkDemo报230错误解决思路
  9. 国家级精品课程计算机程序设计,国家级精品课程
  10. PHP导出CSV文件出现乱码的解决方法
  11. 浅析中断——回首两年
  12. oracle 创建表同时添加注释
  13. 快节奏多人在线游戏网络入门系列教程(4):爆头!滞后补偿
  14. 2019-2020 中国集成电路产业人才白皮书
  15. cURL 详解(附实例)
  16. ⭐算法入门⭐《二分枚举》中等05 —— LeetCode 1201. 丑数 III
  17. 云服务器ecs是虚拟机,云服务器ecs虚拟机
  18. 【R语言】常用的R语言数据挖掘包
  19. 思科网络安全 第十一章测验答案
  20. Android第三方绑定QQ无法拉取授权页面

热门文章

  1. MYSQL的集群的安装与配置(mysql-5.1.21)
  2. Flutter 使用动画播放一组图片
  3. CentOS_7 安装MySql5.7
  4. tmpfiles.d导致的unix:///tmp/supervisor.sock no such file坑(待续)
  5. ISA Server 2006 部署步骤
  6. 索引(转载自百度百科)
  7. 浮动元素的均匀分布和两端对齐
  8. c/c++如何获取数组的长度
  9. 你所应该知道的云计算
  10. if语句写阶跃函数C语言,C语言第四章分支语句.ppt