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

JAVA面试-equals与==的本质区别

Java中与equals()的区别是面试和日常开发的核心知识点其核心差异在于比较的对象是比较引用地址或基本类型的值而equals()是比较对象的内容但其默认行为与重写密切相关 。为了清晰地理解我们可以将比较场景分为两大领域基本数据类型和引用数据类型。一、核心区别概览下表概括了和equals()在不同场景下的行为差异比较维度操作符equals()方法本质二元运算符Object 类中定义的方法比较目标基本类型比较值是否相等引用类型比较两个引用指向的内存地址堆地址是否相同引用类型默认行为与相同比较内存地址。多数类如 String、Integer会重写此方法用于比较对象的逻辑内容是否相等。使用场景判断两个变量无论是基本类型变量还是引用变量是否完全指向同一个对象。判断两个对象在业务逻辑上是否相等而不关心它们是否是同一个内存对象。二、分场景深度解析与代码示例1. 基本数据类型Primitive Types对于int,char,double,boolean等基本类型是唯一可用于比较的操作符它直接比较存储在变量中的值。而equals()是对象的方法基本类型无法调用。int a 100; int b 100; int c 200; System.out.println(a b); // true 因为值相等 System.out.println(a c); // false因为值不相等 // 以下代码无法编译因为基本类型没有 equals 方法 // System.out.println(a.equals(b)); // 编译错误2. 引用数据类型Reference Types这是理解两者区别的关键。所有类、数组、接口创建的变量都是引用类型。此时的比较行为是固定的而equals()的行为取决于其是否被重写 。的行为始终一致比较两个引用变量中存储的内存地址即是否指向堆中的同一个对象。equals()的行为分两种情况情况一未重写equals()例如自定义的类未重写。此时它继承自Object类的默认实现其逻辑就是比较内存地址与效果完全相同 。情况二已重写equals()例如String,Integer,Date等 JDK 常用类。此时比较的是对象的内容或状态。下面通过代码示例进行说明// 示例1自定义类未重写equals class Person { String name; public Person(String name) { this.name name; } } Person p1 new Person(Tom); Person p2 new Person(Tom); Person p3 p1; // p3 指向 p1 引用的同一个对象 System.out.println(p1 p2); // false p1和p2指向堆中两个不同对象 System.out.println(p1 p3); // true p1和p3指向同一个对象 System.out.println(p1.equals(p2)); // false Person类未重写equals默认调用Object的equals效果同 System.out.println(p1.equals(p3)); // true 同上本质是比较地址地址相同所以为true // 示例2String类已重写equals与常量池的影响 String s1 Hello; // 字面量s1指向字符串常量池中的Hello String s2 Hello; // 字面量s2同样指向常量池中已存在的Hello String s3 new String(Hello); // new关键字强制在堆中创建新对象 String s4 new String(Hello); System.out.println(s1 s2); // true! 因为s1和s2都指向常量池中的同一个Hello对象 System.out.println(s1 s3); // false s1在常量池s3在堆中是不同的对象 System.out.println(s3 s4); // false s3和s4是两个不同的堆对象 System.out.println(s1.equals(s2)); // true String重写了equals比较字符序列内容 System.out.println(s1.equals(s3)); // true 内容相同 System.out.println(s3.equals(s4)); // true 内容相同3. 特殊案例Integer的缓存机制JDK对部分包装类如Integer在-128到127范围内实现了缓存这会使得的比较结果出现“意外”这是理解与equals()区别的经典案例 。Integer i1 100; // 自动装箱实际调用 Integer.valueOf(100) Integer i2 100; // 命中缓存返回缓存中已有的同一个 Integer 对象 Integer i3 200; Integer i4 200; // 超出缓存范围new 新的 Integer 对象 System.out.println(i1 i2); // true! [-128,127] 内指向缓存中的同一对象 System.out.println(i3 i4); // false! 超出缓存范围是两个不同的对象 System.out.println(i1.equals(i2)); // true Integer重写了equals比较int值 System.out.println(i3.equals(i4)); // true 比较int值三、重写equals()的实践与规范如果希望自定义的类能够使用equals()进行有意义的逻辑比较必须重写equals()方法。重写时需要遵循通用约定自反性x.equals(x)必须返回true。对称性若x.equals(y)为true则y.equals(x)也必须为true。传递性若x.equals(y)为true且y.equals(z)为true则x.equals(z)也必须为true。一致性只要对象未被修改多次调用x.equals(y)应始终返回相同结果。非空性对于任何非null的xx.equals(null)必须返回false。一个典型的重写equals()的模板如下Override public boolean equals(Object obj) { // 1. 检查是否引用同一对象 if (this obj) return true; // 2. 检查参数是否为null以及是否为同一类型 if (obj null || getClass() ! obj.getClass()) return false; // 3. 将参数转换为当前类型 Person person (Person) obj; // 4. 比较关键字段此处比较name字段 // 注意String本身已正确实现了equals可以直接调用 return Objects.equals(name, person.name); // 使用Objects.equals可安全处理null }重要关联重写equals()必须同时重写hashCode()如果重写了equals()通常必须同时重写hashCode()方法这是为了满足hashCode的通用约定相等的对象必须具有相等的哈希码。这一点在使用HashMap、HashSet等基于哈希的集合时至关重要否则会导致对象在集合中行为异常。Override public int hashCode() { // 使用Objects.hash可以方便地基于多个字段生成哈希码 return Objects.hash(name); }总结在Java中是地址/值比较器行为确定equals()是逻辑相等比较器其行为由类定义决定。对于引用类型的逻辑比较应优先使用正确重写后的equals()方法而主要用于检查引用同一性。理解String常量池和Integer缓存等特例有助于在实际编码和问题排查中避免误区。参考来源总结一下java中我认识的哈希码以及equals和的区别java中 和 equelsequals 和 的区别java 中 equals 和 的区别常问到 equals 与 有什么区别equals和的区别

相关文章:

JAVA面试-equals与==的本质区别

Java中 与 equals() 的区别是面试和日常开发的核心知识点,其核心差异在于比较的对象: 是比较引用地址或基本类型的值,而 equals() 是比较对象的内容,但其默认行为与重写密切相关 。 为了清晰地理解,我们可以将比较场…...

通过 Langchain 框架实现 ChatGPT 的使用

一. 简介Langchain 框架:LangChain 是一个开源框架,是一个让大语言模型(如ChatGPT)能连接外部工具、记忆对话、执行复杂任务的“智能助手”开发框架,解决了LLM应用开发中的各种工程化问题。# LangChain 的核心定位&…...

Alibaba DASD-4B Thinking 对话工具在网络安全领域的应用:智能威胁分析与响应

Alibaba DASD-4B Thinking 对话工具在网络安全领域的应用:智能威胁分析与响应 每天,安全运维团队的工程师们都要面对海量的安全告警。防火墙日志、入侵检测系统的报警、终端防护软件的提示……这些信息像潮水一样涌来。传统的处理方式,往往依…...

效率提升:用快马AI一键生成医院预约系统的核心排班管理代码

医院预约系统开发笔记:如何用AI快速搞定排班管理模块 最近在开发一个医院预约系统,发现排班管理模块特别费时间。传统的开发方式需要手动编写大量重复性代码,从数据库设计到API接口,再到各种业务逻辑校验,一个完整的排…...

实战应用:基于编译原理,利用快马AI构建你的首个代码压缩工具

实战应用:基于编译原理,利用快马AI构建你的首个代码压缩工具 最近在学习编译原理,发现这门看似高深的学科其实离我们日常开发很近。比如代码压缩工具,就是编译原理技术的典型应用场景。今天就用InsCode(快马)平台来快速实现一个简…...

实战react项目:基于快马ai快速构建包含图表与导航的用户数据仪表盘

最近在做一个用户数据仪表盘项目,正好用React配合Ant Design实现了一套完整的界面。这种包含导航、图表和动态数据的页面在后台系统中很常见,记录下我的实现思路和踩坑经验。 项目结构规划 首先用create-react-app初始化项目,然后按功能模块…...

新手友好:基于快马平台快速上手dhnvr416h-hd设备数据监控开发

新手友好:基于快马平台快速上手dhnvr416h-hd设备数据监控开发 最近在做一个物联网项目,需要对接dhnvr416h-hd设备的数据监控功能。作为刚接触这个领域的新手,我发现理解设备数据格式和通信流程是最关键的第一步。好在通过InsCode(快马)平台的…...

安全治理加速金融AI收入增长

金融机构正在学习如何部署合规的AI解决方案,以实现更大的收入增长和市场优势。在过去十年的大部分时间里,金融机构主要将AI视为提高纯粹效率的机制。在那个时代,量化团队编写系统来发现账本差异或减少自动交易执行时间中的毫秒。只要季度资产…...

DCT-Net人像卡通化真实案例:企业年会电子抽奖卡通头像墙

DCT-Net人像卡通化真实案例:企业年会电子抽奖卡通头像墙 年底了,公司年会又要来了。行政部的同事找到我,说今年想搞点新花样,电子抽奖环节能不能不用大家千篇一律的证件照,换成好玩的卡通头像墙?这样抽奖的…...

Echo:预测智能的一小步,通往通用智能的一大步

来源:机器之心大模型能否预测未来?UniPat AI 构建了一套完整的预测智能基础设施,Echo,包含动态评测引擎、面向未来事件的训练范式和预测专用模型 EchoZ-1.0。在其公开的 General AI Prediction Leaderboard 上,EchoZ-1…...

Qwen-Turbo-BF16数据库课程设计:智能问答系统开发

Qwen-Turbo-BF16数据库课程设计:智能问答系统开发 想象一下,你正在上一门数据库课程。老师布置了一个课程设计:开发一个学生信息管理系统。你需要设计表结构,写SQL查询,还要做个简单的界面。你埋头苦干,终…...

Oni-Duplicity:轻松定制《缺氧》游戏体验,告别资源与角色困扰

Oni-Duplicity:轻松定制《缺氧》游戏体验,告别资源与角色困扰 【免费下载链接】oni-duplicity A web-hosted, locally-running save editor for Oxygen Not Included. 项目地址: https://gitcode.com/gh_mirrors/on/oni-duplicity 你是否曾在《缺…...

Precor必确 GLUTEBUILDER 系列,带来系统化臀部训练解决方案

在健身训练不断细分的当下,臀部训练早已不再是“顺带练一练”的附属项目,而是被置于与胸、背、腿同等重要的核心地位。然而,真正高效的臀腿训练,从来不是简单堆叠负重,而是建立在精准发力与动作模式科学之上的系统工程…...

硕博必看|论文盲审前,这些硬伤一定要避开!

作为过来人,太懂硕博生面对论文盲审的焦虑——熬夜完成的论文,查重、改格式、找导师签字后,仍怕因细节被盲审专家打回、延毕。盲审专家只看质量不看人情,很多不起眼的小问题,都可能成为“致命扣分点”。今天分享核心干…...

Guardrails未来版本路线图:10大新功能全面展望与AI安全演进

Guardrails未来版本路线图:10大新功能全面展望与AI安全演进 【免费下载链接】guardrails Adding guardrails to large language models. 项目地址: https://gitcode.com/gh_mirrors/gu/guardrails 在大型语言模型(LLM)应用日益普及的今…...

Springboot 整合 SaToken 实现高效鉴权与动态路由拦截实战

1. 为什么选择SaToken做权限管理? 第一次接触SaToken是在去年重构一个内部管理系统时。当时项目用的是Spring Security,配置繁琐不说,光是解决一个"记住我"功能就折腾了两天。后来偶然发现这个国产框架,只用三行代码就实…...

2026算力大劫:全球开发者都在问:廉价算力到底去哪了?哪里的token性价比最高?

▶︎点击这里查看最新套餐https://coding.dongyao.ren/ 1. 2026:被“刺客”化的算力账单 进入2026年,AIGC行业并没有迎来预想中的“算力普惠”。相反,随着GPT-5.5等万亿参数模型成为企业刚需,以及北美云巨头在2026年第一季度集体…...

3月31枚举

...

无需安装jupyter notebook,在快马平台5分钟搭建你的第一个数据分析原型

今天想和大家分享一个快速搭建数据分析原型的经验。作为一个经常需要验证想法的数据分析师,最头疼的就是每次换电脑或重装系统后配置Jupyter Notebook环境的过程。最近发现了一个超省心的解决方案,不用本地安装就能直接开搞数据分析。 为什么选择云端Ju…...

高效突破语言壁垒:KISS Translator的全场景翻译解决方案

高效突破语言壁垒:KISS Translator的全场景翻译解决方案 【免费下载链接】kiss-translator A simple, open source bilingual translation extension & Greasemonkey script (一个简约、开源的 双语对照翻译扩展 & 油猴脚本) 项目地址: https://gitcode.c…...

基于YOLO的安全帽佩戴检测系统~Python+模型训练+2026原创+YOLO算法

项目简介 基于 YOLO 的智能安全帽佩戴检测平台,面向施工现场图片识别、检测记录管理与安全宣传信息展示等业务场景。系统后端采用 Flask 搭建 RESTful API 服务,结合数据库进行业务数据持久化存储,并通过 JWT 实现用户身份认证与接口访问控制…...

学习---3

有序数组的排序:一、暴力解法:思路:遍历数组,对每个数组元素进行平方,再用sort排序。时间复杂度:O(nlog n)二、双指针解法:思路:如果有序数组中有负数,那么这个负数平方之…...

手把手教你用Python计算斯皮尔曼相关系数:从手动推导到scipy一键调用

深入掌握Python中的斯皮尔曼相关系数:从数学原理到实战应用 在数据分析领域,理解变量之间的关系是至关重要的。斯皮尔曼相关系数作为一种非参数统计量,能够揭示数据间的单调关联,而不仅仅是线性关系。本文将带你从基础概念出发&am…...

别再硬编码了!用注解+工厂模式,5分钟为你的Java应用扩展一个新PLC协议(ModbusTCP/S7为例)

工业物联网中Java协议扩展的优雅实践:注解驱动与工厂模式深度整合 工业物联网(IIoT)平台的开发者们经常面临一个棘手问题:如何在不重构核心代码的情况下,快速接入各种PLC设备协议?想象一下这样的场景:你的系统已经稳定…...

新手也能看懂!5分钟搞懂图像频谱图:用MATLAB的fft2和fftshift分析图片细节

图像频谱图解析:用MATLAB透视照片的隐藏密码 想象一下,如果每张照片都能像X光片一样被"透视",让我们看到它内部隐藏的结构特征,那会怎样?这就是图像频谱图的魔力所在。不同于我们日常看到的像素排列&#xf…...

别再只盯着虚短虚断!运放设计必须掌握的6个非理想参数(附MCP6N16实测数据)

运算放大器非理想特性实战指南:从理论到MCP6N16实测 在嵌入式系统设计中,运算放大器如同精密仪器中的齿轮,其微小偏差可能导致整个测量系统的崩溃。许多工程师在初期学习阶段被"虚短虚断"的理想模型所束缚,直到实际项目…...

Windows 11本地Ollama大模型部署实战指南

1. Windows 11本地部署Ollama大模型的前期准备 最近在折腾本地大模型部署,发现Ollama这个工具确实挺适合新手入门的。相比其他复杂的部署方案,Ollama在Windows平台上的安装过程简单明了,而且支持多种主流开源大模型。不过在实际操作中&#x…...

省钱方案:用NAT主机+Frpc实现高速内网穿透(避坑指南)

低成本内网穿透实战:NAT主机与Frpc的高效组合方案 引言:为什么选择NAT主机Frpc方案? 对于需要远程访问家庭NAS、搭建私有云盘或部署开发测试环境的用户来说,内网穿透是刚需。传统方案要么成本高昂(独立IP服务器&#x…...

OpenModScan:免费开源的Modbus调试工具完整指南

OpenModScan:免费开源的Modbus调试工具完整指南 【免费下载链接】OpenModScan Open ModScan is a Free Modbus Master (Client) Utility 项目地址: https://gitcode.com/gh_mirrors/op/OpenModScan 在工业自动化领域,Modbus通讯协议的调试和测试是…...

5步精通Trilium中文版:构建高效个人知识管理系统

5步精通Trilium中文版:构建高效个人知识管理系统 【免费下载链接】trilium-translation Translation for Trilium Notes. Trilium Notes 中文适配, 体验优化 项目地址: https://gitcode.com/gh_mirrors/tr/trilium-translation 认识Trilium:重新定…...