news 2026/6/7 22:19:23

== 和 equals 比较有什么区别?一文带你彻底搞懂

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
== 和 equals 比较有什么区别?一文带你彻底搞懂

== 和 equals 比较有什么区别?一文带你彻底搞懂

    • 1. 先看结论(速记版)
    • 2. 流程图:判断规则一览
    • 3. 代码演示:一步步验证
      • 3.1 基本数据类型(只有 `==`)
      • 3.2 引用类型未重写 `equals`
      • 3.3 引用类型已重写 `equals`(String 为例)
      • 3.4 特殊情况:字符串常量池
    • 4. 源码解读:为什么默认 `equals` 等同于 `==`
      • Object 类中的 `equals` 源码:
      • String 类重写后的 `equals` 逻辑:
    • 5. 开发中的最佳实践与注意事项
      • ✅ 正确用法示例
      • ❌ 常见错误
    • 6. 总结记忆口诀
    • 7. 思考题(检验你是否真的懂了)

🌺The Begin🌺点点关注,收藏不迷路🌺

⬇ ⬇ 底部 ⬇ ⬇

在 Java 面试或日常开发中,==equals的比较是一个经典且高频的问题。很多初学者甚至工作经验丰富的开发者也容易在这里翻车。本文将通过原理讲解、代码示例、流程图等方式,带你彻底搞懂这两者的区别。


1. 先看结论(速记版)

比较类型==equals
基本数据类型比较是否相等不能使用(编译错误)
引用数据类型(未重写 equals)比较内存地址(是否同一个对象)默认也是比较内存地址(同==
引用数据类型(已重写 equals)比较内存地址比较内容(如 String、Integer 等)

一句话总结:

  • ==比较的是“是不是同一个对象”(基本类型比较值)
  • equals比较的是“逻辑上是否相等”(需要看是否重写)

2. 流程图:判断规则一览

基本数据类型

引用数据类型

==

equals

未重写

已重写

开始比较

比较的是什么类型?

==:比较数值是否相等

使用的是 == 还是 equals?

比较内存地址
是否同一个对象

该类是否重写了 equals?

调用 Object.equals
等价于 ==,比较地址

按重写逻辑比较内容
例如 String、Integer


3. 代码演示:一步步验证

3.1 基本数据类型(只有==

inta=10;intb=10;System.out.println(a==b);// true

基本类型不能调用equals,编译器会直接报错。


3.2 引用类型未重写equals

classPerson{Stringname;Person(Stringname){this.name=name;}}Personp1=newPerson("Alice");Personp2=newPerson("Alice");System.out.println(p1==p2);// false(不同对象)System.out.println(p1.equals(p2));// false(默认 == 比较地址)

即使两个对象内容相同,==equals结果都是false


3.3 引用类型已重写equals(String 为例)

Strings1=newString("hello");Strings2=newString("hello");System.out.println(s1==s2);// false(不同对象)System.out.println(s1.equals(s2));// true(内容相同)

String、Integer、Date 等 JDK 常用类都重写了equals


3.4 特殊情况:字符串常量池

Strings3="hello";Strings4="hello";System.out.println(s3==s4);// true(常量池同一对象)System.out.println(s3.equals(s4));// true

这里==为 true 是因为 JVM 字符串常量池复用,不要误以为 String 的==比较内容


4. 源码解读:为什么默认equals等同于==

Object 类中的equals源码:

publicbooleanequals(Objectobj){return(this==obj);}

所以任何类如果没有重写equals,那么它和==行为完全一致。

String 类重写后的equals逻辑:

publicbooleanequals(ObjectanObject){if(this==anObject)returntrue;if(anObjectinstanceofString){StringanotherString=(String)anObject;intn=value.length;if(n==anotherString.value.length){charv1[]=value;charv2[]=anotherString.value;inti=0;while(n--!=0){if(v1[i]!=v2[i])returnfalse;i++;}returntrue;}}returnfalse;}

先比较地址,再比较长度,最后比较每个字符。


5. 开发中的最佳实践与注意事项

✅ 正确用法示例

场景推荐方式原因
基本类型判断==效率高,语义清晰
枚举比较==枚举单例,地址唯一
判断对象是否为null==equals会空指针
字符串内容比较equals必须比较内容
自定义类内容比较重写equals+hashCode符合业务逻辑

❌ 常见错误

  1. 字符串比较用==

    Stringa=getSomeString();if(a=="admin"){...}// 危险!
  2. equals 前没有判空

    Stringb=null;if(b.equals("test")){...}// NullPointerException
  3. 重写 equals 不重写 hashCode

    会导致 HashMap、HashSet 等集合出现逻辑错误。


6. 总结记忆口诀

基本类型值相等,==直接就能定。
引用类型若相同,==只看地址同不同。
逻辑相等看内容,重写equals必须通。
字符串比较要小心,equals才真正通。


7. 思考题(检验你是否真的懂了)

Integeri1=100;Integeri2=100;Integeri3=200;Integeri4=200;System.out.println(i1==i2);System.out.println(i3==i4);System.out.println(i1.equals(i2));

答案:truefalsetrue
原因:Integer 缓存 -128~127,范围内==为 true,范围外 new 新对象。


希望这篇文章能让你彻底告别==equals的困惑。如果觉得有帮助,欢迎点赞、收藏、转发!

👉 关注我,更多 Java 干货持续更新中。


🌺The End🌺点点关注,收藏不迷路🌺

⬆ ⬆ 顶部 ⬆ ⬆
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/7 22:14:33

终极指南:FDS火灾动力学模拟器,建筑消防安全的科学利器

终极指南:FDS火灾动力学模拟器,建筑消防安全的科学利器 【免费下载链接】fds Fire Dynamics Simulator 项目地址: https://gitcode.com/gh_mirrors/fd/fds 在建筑消防安全设计中,你是否还在依赖经验公式?FDS火灾动力学模拟…

作者头像 李华
网站建设 2026/6/7 22:13:58

保姆级教程:用QGIS 3.28切好瓦片,再用Nginx发布,Cesium调用一步到位

从QGIS切片到Cesium调用的全流程实战指南引言在当今数字化时代,地理信息系统(GIS)和WebGIS应用正变得越来越普及。无论是城市规划、环境监测还是商业选址,能够快速搭建并发布在线地图服务已成为许多开发者和分析师的必备技能。本文将带你完整走一遍从QGI…

作者头像 李华
网站建设 2026/6/7 22:06:47

告别数据混乱!用CDO在Linux上5分钟搞定气象NetCDF/GRIB文件的合并与拆分

告别数据混乱!用CDO在Linux上5分钟搞定气象NetCDF/GRIB文件的合并与拆分气象科研人员每天面对TB级的NetCDF和GRIB数据时,最头疼的莫过于分散在不同文件中的时间序列。我曾见过同事为了拼接一年的CMIP6模式数据,写了几百行Python脚本&#xff…

作者头像 李华
网站建设 2026/6/7 22:04:26

三步搞定OFD转PDF:免费开源工具让你告别格式烦恼

三步搞定OFD转PDF:免费开源工具让你告别格式烦恼 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 你是否曾在工作中遇到这样的困扰:财务报销系统只接受PDF格式,而收…

作者头像 李华
网站建设 2026/6/7 22:00:14

洛雪音乐 V1.8.0下载,2026更新

这个软件是一个 “播放器空壳” ,它本身没有音乐库。你需要自己给它添加网上的音乐源链接,它才能播放歌曲。 主要特点: 免费、干净:软件本身免费,没有广告,专注于播放功能。 高度自定义: 核心是…

作者头像 李华