Java 最经典面试题:== 和 equals() 到底有什么区别?一文彻底搞懂!
学习 Java 时几乎每个人都会遇到这样一道经典面试题Java 中和equals()有什么区别很多初学者都会回答“比较地址equals()比较内容。”这句话虽然对但并不完整甚至在某些情况下还是错的。今天我们就从零开始把这个问题彻底讲明白。一、什么是是 Java 的一个比较运算符。它既可以比较基本数据类型也可以比较引用类型但比较规则不同。1、比较基本数据类型对于基本数据类型int、double、char、boolean等比较的是值是否相等。例如inta10;intb10;System.out.println(ab);输出true因为a 的值10 b 的值10两个值相同所以返回true。再例如doublex3.14;doubley3.14;System.out.println(xy);结果仍然是true因此基本数据类型使用比较的是值。2、比较引用类型对于对象来说比较的是两个引用是否指向同一个对象。例如Strings1newString(Java);Strings2newString(Java);System.out.println(s1s2);输出false为什么因为内存中实际上创建了两个对象。堆内存 ------------- s1 --| Java | ------------- ------------- s2 --| Java | -------------虽然内容一样但它们是两个不同的对象。所以s1 s2比较的是两个引用是否指向同一个对象答案是不是因此返回false所以引用类型使用比较的是对象地址更准确地说是比较引用是否指向同一个对象。二、什么是equals()equals()是Object类中的一个方法。源码如下publicbooleanequals(Objectobj){return(thisobj);}可以发现Object 默认实现的equals()本质上还是使用。也就是说默认情况下obj1.equals(obj2)等价于obj1obj2因此如果一个类没有重写equals()那么equals()和的效果完全一样。三、为什么还要有equals()因为很多时候我们更关心的是内容是否相同而不是是不是同一个对象例如Strings1newString(Java);Strings2newString(Java);虽然s1和s2不是同一个对象。但是字符串内容都是 Java。这时候System.out.println(s1.equals(s2));输出true为什么因为String类重写了equals()方法。源码思想可以简化理解为publicbooleanequals(Objectobj){比较两个字符串长度 再比较每一个字符 全部相同返回true}因此Java 和 Java内容一样所以返回true四、什么时候和equals()结果不同来看一个经典例子。Strings1newString(abc);Strings2newString(abc);System.out.println(s1s2);System.out.println(s1.equals(s2));输出false true为什么比较的是是不是同一个对象答案不是。所以falseequals()比较的是字符串内容是否相同答案都是 abc。所以true这也是 Java 面试最经典的一道题。五、为什么有时候又是 true例如Strings1Java;Strings2Java;System.out.println(s1s2);输出true很多初学者会疑惑不是说比较地址吗为什么这里又是true原因是Java 有字符串常量池String Pool。当写Strings1Java;Strings2Java;实际上字符串常量池 --------- | Java | --------- ↑ ↑ s1 s2两个变量都指向常量池中的同一个字符串对象。因此s1 s2结果就是true如果使用newString(Java)就会重新创建对象。因此Strings1newString(Java);Strings2newString(Java);内存变成堆 -------- -------- | Java | | Java | -------- -------- ↑ ↑ s1 s2自然s1 s2就是false六、自定义对象为什么 equals() 还是 false例如classStudent{Stringname;Student(Stringname){this.namename;}}创建两个对象Students1newStudent(Tom);Students2newStudent(Tom);System.out.println(s1.equals(s2));输出false为什么因为Student 没有重写equals()。它继承的是Object.equals()而Object.equals()底层就是thisobj比较地址。因此false七、如何让 equals() 比较内容只需要重写equals()。例如importjava.util.Objects;classStudent{Stringname;Student(Stringname){this.namename;}Overridepublicbooleanequals(Objectobj){if(thisobj){returntrue;}if(objnull||getClass()!obj.getClass()){returnfalse;}Studentother(Student)obj;returnObjects.equals(name,other.name);}}现在Students1newStudent(Tom);Students2newStudent(Tom);System.out.println(s1.equals(s2));输出true因为现在比较的是name 是否相同。这也是实际开发中最常见的做法。八、为什么重写 equals() 通常还要重写 hashCode()这是很多面试都会追问的问题。例如HashSetStudentsetnewHashSet();如果两个对象equals()返回true但是hashCode()不同。那么HashSet 仍然可能把它们当成两个不同对象。因此 Java 官方规定如果重写了 equals()通常也必须重写 hashCode()保证相等对象具有相同的哈希值。IDE如 IntelliJ IDEA通常也会提示同时生成这两个方法。九、面试怎么回答如果面试官问Java 中和equals()有什么区别可以这样回答是比较运算符。对于基本数据类型它比较的是值对于引用类型它比较的是两个引用是否指向同一个对象。equals()是Object类的方法默认实现也是比较引用但很多类例如 String、Integer、自定义实体类都会重写equals()用于比较对象内容是否相等。因此是否比较内容取决于该类是否重写了equals()方法。这是比较标准、完整的面试回答。十、总结最后用一张表总结比较方式基本数据类型引用类型比较值比较是否指向同一个对象equals()不适用基本类型不能调用方法默认比较引用重写后通常比较内容记住下面四句话即可比较基本类型时比较值。比较对象时比较引用是否指向同一个对象。equals()默认和一样因为 Object 的实现本质就是。很多类如 String重写了equals()因此equals()往往用于比较对象内容。一句话总结是 Java 的比较运算符比较值或对象引用equals()是对象的方法默认比较引用但重写后通常用于比较对象内容是否相等。

相关新闻

面试官:介绍一下 Java 异常!99% 的人都答不全(附异常体系图)

面试官:介绍一下 Java 异常!99% 的人都答不全(附异常体系图)

很多 Java 初学者刚接触异常时都会有这样的疑问: 什么是异常(Exception)?为什么 Java 要设计异常机制?Error 和 Exception 有什么区别?Checked Exception 和 RuntimeException 又是什么?try、ca…

2026/7/14 12:55:02阅读更多 →
如何在43秒内解锁星露谷物语所有XNB资源:StardewXnbHack完全指南

如何在43秒内解锁星露谷物语所有XNB资源:StardewXnbHack完全指南

如何在43秒内解锁星露谷物语所有XNB资源:StardewXnbHack完全指南 【免费下载链接】StardewXnbHack A simple one-way XNB unpacker for Stardew Valley. 项目地址: https://gitcode.com/gh_mirrors/st/StardewXnbHack 想要定制你的星露谷物语游戏体验吗&…

2026/7/14 12:55:02阅读更多 →
3分钟学会无损视频剪辑:LosslessCut 终极使用指南

3分钟学会无损视频剪辑:LosslessCut 终极使用指南

3分钟学会无损视频剪辑:LosslessCut 终极使用指南 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 想要快速剪辑视频却担心画质损失?今天我要介…

2026/7/14 12:55:02阅读更多 →
147、超分模型中的残差学习:从SRResNet到RCAN的演进

147、超分模型中的残差学习:从SRResNet到RCAN的演进

147、超分模型中的残差学习:从SRResNet到RCAN的演进 去年帮一个医疗影像项目做超分,客户要求把病理切片放大4倍,同时保留细胞核的纹理细节。我兴冲冲地上了个SRResNet,结果跑出来的结果——边缘倒是锐利了,但细胞核内部出现了奇怪的棋盘格伪影,像被砂纸打磨过一样。调试了…

2026/7/14 14:10:10阅读更多 →
148、超分模型中的频域分析:高频细节恢复与低频保持

148、超分模型中的频域分析:高频细节恢复与低频保持

148、超分模型中的频域分析:高频细节恢复与低频保持 去年调一个EDSR的复现,在DIV2K上训练了三天,PSNR涨了0.02dB,但肉眼一看,纹理糊成一片,边缘锯齿感强得离谱。当时我盯着loss曲线,心想这模型到底在学什么?后来把特征图做FFT可视化,才明白问题出在哪——模型把精力全…

2026/7/14 14:10:10阅读更多 →
Processing.py入门指南:用Python开启创意编程之旅

Processing.py入门指南:用Python开启创意编程之旅

Processing.py入门指南:用Python开启创意编程之旅 【免费下载链接】processing.py Write Processing sketches in Python 项目地址: https://gitcode.com/gh_mirrors/pr/processing.py Processing.py是一个让开发者能够使用Python语言编写Processing图形程序…

2026/7/14 14:10:10阅读更多 →
10个必知的HTTP安全头:用shcheck验证你的网站防护

10个必知的HTTP安全头:用shcheck验证你的网站防护

10个必知的HTTP安全头:用shcheck验证你的网站防护 【免费下载链接】shcheck A basic tool to check security headers of a website 项目地址: https://gitcode.com/gh_mirrors/sh/shcheck 在当今网络安全环境中,HTTP安全头是保护网站免受常见攻击…

2026/7/14 14:10:10阅读更多 →
构建智能AI助手生态:Skills CLI如何重塑开发者与AI代理的协作方式

构建智能AI助手生态:Skills CLI如何重塑开发者与AI代理的协作方式

构建智能AI助手生态:Skills CLI如何重塑开发者与AI代理的协作方式 【免费下载链接】skills The open agent skills tool - npx skills 项目地址: https://gitcode.com/GitHub_Trending/ad/skills 在人工智能技术快速发展的今天,AI编码助手已成为开…

2026/7/14 14:10:10阅读更多 →
2026年,Superpowers 可能不再是 Claude/Codex/Workbuddy 的最佳方案了(附实操建议)

2026年,Superpowers 可能不再是 Claude/Codex/Workbuddy 的最佳方案了(附实操建议)

Superpowers 的问题越来越大了。从 Superpowers 发布到现在,我一直是它的忠实用户。相信使用 Claude、Codex 或者 Workbuddy 的你,它都是「先装为敬」的 Skill。但最近我体感越来越差了,问题出在它的思考强度太大,一次问题的处理&…

2026/7/14 14:05:09阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/14 4:56:14阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/14 2:55:05阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/14 6:17:41阅读更多 →
【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

【Cursor数据库安全红线】:自动执行SQL前必须校验的6项权限策略,金融级项目已强制落地

更多请点击: https://intelliparadigm.com 第一章:Cursor数据库安全红线概览 Cursor 作为一款基于 AI 的智能编程助手,其本地数据库(SQLite 存储)承载着用户代码片段、会话历史、自定义规则及敏感上下文信息。理解其安…

2026/7/14 0:03:18阅读更多 →
【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

【Notion AI写作避坑白皮书】:基于127份真实用户失败案例,总结6大致命误用陷阱

更多请点击: https://codechina.net 第一章:Notion AI写作辅助的底层能力边界认知 Notion AI 并非通用大语言模型的直接封装,而是基于 Llama 系列与自研微调模型构建的轻量化推理服务,其输入上下文窗口严格限制在 8192 token&…

2026/7/14 0:03:18阅读更多 →
AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

AI Agent数据越界行为如何被精准溯源?——基于GDPR/CCPA双合规的5层审计框架实战指南

更多请点击: https://kaifayun.com 第一章:AI Agent数据越界行为的合规性挑战与溯源必要性 AI Agent在自主执行任务过程中,可能因提示注入、上下文污染或权限配置缺陷,无意或有意访问、缓存、传输受保护数据(如PII、G…

2026/7/14 0:03:18阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/13 4:21:17阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/14 4:45:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/14 2:42:17阅读更多 →