让我们每天都有进步,老王带你打造最全的 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 的区别吗?

你真的知道 == 和 equals 的区别吗?相关推荐

  1. java byte 判断相等_你真的了解Java中quot;==quot;和equals()的区别?

    部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA 密码:jsam 想获得全部面试必看资料,关注公众号,大家可以在公众号后台回复" ...

  2. 面试必问一:Java 中 == 和 equals 的区别你知道吗

    面试必问一:Java 中 == 和 equals 的区别你知道吗 前言 关于这个问题,一般初中级面试中都会遇到,还记得我当初实习找工作的时候也遇到了这个问题,现在都还记得自己是怎么回答的:== 是基本 ...

  3. Java中Object.equals与String.equals的区别

    基础知识 Java的存储空间:寄存器.栈.堆.静态存储区.常量存储区(常量池).其他存储位置. 此处重点介绍堆和常量存储区: 堆:存储new的对象; 常量池:用来存储final static.Stri ...

  4. 二十六、深入HashCode与equals的区别(上篇)

    @Author:Runsen @Date:2020/6/2 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  5. java ==和=_Java ==和equals()的区别

    前言 本篇文章讲的是从JVM角度比较==和equals的区别 一:** Java数据类型分类** Paste_Image.png 1:基本数据类型 又称为原始数据类型,他们之间的比较应该使用(==), ...

  6. 02 理解==与Equals()的区别及用法 1214

    02 理解==与Equals()的区别及用法 01 02 03

  7. Java中equals()和“==”区别

    Java中equals()和"=="区别 1.对于基础数据类型,使用"=="比较值是否相等: 2.对于复合数据类型(类),使用equals()和"== ...

  8. java中的==和equals的区别

    关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...

  9. 关于Java你不知道的那些事之等等与equals的区别

    等等与equals的区别 前言 代码一 代码二 总结 前言 我们都知道, == 是比较内存地址,equals是比较值 但是这种非常错误的一种观点 ==:比较基本数据类型的时候,比较的是值,引用数据类型 ...

最新文章

  1. 使用 .NET 实现 Ajax 长连接
  2. Java .net 心得_关于Java和.Net的一些感想
  3. Iptables防火墙详细介绍与实战增强服务器安全
  4. Android内存控制小技巧-使用矢量图来节省你的内存并简化你的开发。
  5. 如何高效地遍历 MongoDB 超大集合?
  6. turtle库绘制圆_Python绘画:应用Turtle库绘制“抖音艺术字”
  7. android线性布局快捷键,【整理】Android图形界面知识学习与总结之:Linear Layout线性布局...
  8. python读取配置文件 ConfigParser
  9. (转)基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作...
  10. [unity3d]自定义鼠标指针
  11. java打印等腰三角形_可打印丨四年级数学易错易失分的26个知识点总结(附例题+答案),给孩子收藏!...
  12. §3—1 复式记账法 [第三章 复式记账 ]
  13. 有人培训设计模式,吾表示难以理解,因为根本没用
  14. 社区分享 | 从零开始学习 TinyML(一)
  15. 关于软考,人事考试照片格式要求如何修改,且通过照片审核处理系统。要求295px*413px像素
  16. 附近的人实现原理详细剖析!
  17. 中科院计算机技术研究所张浩,中国科学院计算技术研究所 韩 琥 博士
  18. 计算机网络笔记(王道考研) 第二章:物理层
  19. 一个实用分数类Fraction的Java实现
  20. 李云赫天津大学计算机,祝贺创业谷涌现全国自强之星,同济创业谷,陪伴这个世上最有梦想的人...

热门文章

  1. ANSIBLE---变量
  2. MySQL:查询条件
  3. 日常问题——hadoop启动后发现namenode没有启动,但是排除了格式化过度的问题
  4. 远程网络安装RHEL5
  5. 上海交通大学2006年各学院本科生平均薪酬统计
  6. [转]资本经营董事长班告诉你:不只企业有商业模式,个人商业价值更重要
  7. 百度腾讯中兴华为全部入局Linux Foundation深度学习基金会
  8. Spring Security源码分析四:Spring Social实现微信社交登录
  9. J2EE基础之Web服务简介
  10. 物联网碰到云计算会怎么样?