Java中==和equals()方法的区别是什么?

答案是:==比较值或内存地址,equals()比较逻辑内容,重写equals()需遵守五契约并同步重写hashCode()。

java中==和equals()方法的区别是什么?

==

在 Java 里主要比较的是值或内存地址。对于基本数据类型(如

int

,

char

,

boolean

),它比较的是它们实际的数值。但对于对象类型,

==

比较的是这两个引用是否指向了内存中的同一个对象实例。而

equals()

方法,它的设计初衷就是为了比较两个对象的内容是否逻辑上相等。默认情况下,

Object

类里的

equals()

实现和

==

行为一样,也是比较内存地址,但很多类,比如

String

、

Integer

等,都重写了这个方法,让它比较对象内部的数据。

说实话,每次讲到

==

和

equals()

的区别,我总觉得像是在重温 Java 基础的“九阳真经”第一页。但它确实太重要了,因为稍有不慎,就可能踩到坑里,导致程序行为不符合预期。

咱们先从最直观的看。如果你有两个

int

变量

a = 5

和

b = 5

,那么

a == b

肯定是

true

。这里

==

就是老老实实地比对那两个“5”这个数值。没毛病。

但如果换成对象呢?假设我们有

String s1 = new String("hello")

和

String s2 = new String("hello")

。这时候

s1 == s2

会是

false

。为什么?因为

new String()

每次都会在堆内存里创建一个全新的

String

对象。所以

s1

和

s2

虽然内容都是 “hello”,但它们是两个不同的对象实例,内存地址不一样。而

==

关注的就是这个内存地址。

立即学习“Java免费学习笔记(深入)”;

这时候

equals()

就登场了。对于

String

类,它早就被重写了,所以

s1.equals(s2)

会返回

true

。

String

类的

equals()

不看内存地址,它会逐个字符地比较两个字符串的内容。这才是我们大多数时候希望的“相等”概念,对吧?我们关心的是“你是不是叫张三”,而不是“你是不是坐在我旁边的张三”。

再来个例子,如果你自己写一个

Person

类,里面有

name

和

age

字段。如果你不重写

equals()

方法,那么

new Person("Alice", 30) == new Person("Alice", 30)

肯定是

false

,甚至

new Person("Alice", 30).equals(new Person("Alice", 30))

也会是

false

。因为默认的

equals()

行为就是

==

的行为。要让这两个“Alice, 30”在逻辑上相等,你就得手动去重写

equals()

,告诉 Java 虚拟机,当

name

和

age

都一样的时候,这两个

Person

对象就算相等。这其实就是赋予了对象“内容相等”的语义。

有时候,我会看到一些新手,甚至是老手,在比较

Integer

对象时犯错。比如

Integer i1 = 100; Integer i2 = 100;

此时

i1 == i2

可能是

true

。但

Integer i3 = 200; Integer i4 = 200;

此时

i3 == i4

却可能是

false

。这背后涉及到

Integer

的缓存机制(-128到127之间的整数会被缓存)。这种“看脸”的相等性判断,真的让人头疼。所以,对于对象包装类,永远用

equals()

才是最稳妥的。

总结一下,

==

就像是身份证号比对,看是不是同一个人(内存地址)。

equals()

则是内容比对,看是不是同一个人(逻辑内容)。理解这个核心差异,基本上就抓住了关键。

重写

equals()

方法时,有哪些“坑”是必须注意的?

重写

equals()

绝对不是件小事,它有一套严格的契约,一旦违反,程序行为就可能变得诡异莫测。我见过太多因为

equals()

没写对,导致

HashMap

、

HashSet

行为异常的案例。

最基础的,就是

equals()

方法必须满足以下五个特性,这被称为“

equals()

契约”:

自反性 (Reflexive): 任何非

null

的对象

x

,

x.equals(x)

必须返回

true

。这很直观,自己和自己肯定相等。对称性 (Symmetric): 如果

x.equals(y)

返回

true

,那么

y.equals(x)

也必须返回

true

。这个性质经常被忽略,尤其是在涉及继承的时候。比如,

ColorPoint

和

Point

,如果

ColorPoint

的

equals()

只比较

x, y

坐标,那么

new Point(1,2).equals(new ColorPoint(1,2,Color.RED))

可能会是

true

,但反过来

new ColorPoint(1,2,Color.RED).equals(new Point(1,2))

却可能因为

ColorPoint

内部的

color

字段而返回

false

,这就违反了对称性。通常的建议是,如果想在子类中添加新的字段,就不要扩展

equals()

的行为,而是使用组合(composition)而不是继承。传递性 (Transitive): 如果

x.equals(y)

返回

true

,并且

y.equals(z)

返回

true

,那么

x.equals(z)

也必须返回

true

。这在多层继承或者复杂对象比较时尤其容易出错。一致性 (Consistent): 如果参与比较的对象信息没有被修改,那么无论调用多少次

x.equals(y)

,结果都应该保持一致。这意味着

equals()

的判断逻辑不应该依赖于随机数、当前时间或者网络状态这些不确定的因素。非空性 (Non-nullity): 任何非

null

的对象

x

,

x.equals(null)

必须返回

false

。这是为了避免

NullPointerException

,也是一个基本的防御性编程习惯。

除了这五大契约,还有一个非常关键的点:重写

equals()

时,必须同时重写

hashCode()

方法。 这是因为

HashMap

、

HashSet

等基于散列(hash)的数据结构,都是先通过

hashCode()

来快速定位对象的存储位置,再通过

equals()

来确认对象是否真的相等。如果两个逻辑上相等的对象有不同的

hashCode

,那么它们在

HashMap

中就可能被存储在不同的位置,导致

get()

方法找不到本应存在的数据。反之,如果

hashCode()

相同,

equals()

不同,那性能会下降,但至少功能上不会出错。但如果

equals()

相同,

hashCode()

不同,那就彻底乱套了。

所以,在实现

equals()

时,我通常会遵循一个模式:

@Overridepublic boolean equals(Object o) {    if (this == o) return true; // 自反性,性能优化    if (o == null || getClass() != o.getClass()) return false; // 非空性,类型检查    // 或者用 o instanceof MyClass,但这在继承场景下可能带来对称性问题,getClass() 更严格    MyClass myClass = (MyClass) o;    // 逐一比较关键字段    return field1 == myClass.field1 &&           Objects.equals(field2, myClass.field2) && // 使用 Objects.equals 处理 null 值           // ... 其他字段           ;}@Overridepublic int hashCode() {    // 使用 Objects.hash() 方便地生成哈希码,它能处理 null 值    return Objects.hash(field1, field2 /*, ... 其他字段 */);}

这里

Objects.equals()

和

Objects.hash()

是 Java 7 引入的工具类,它们能很好地处理

null

值,避免了手动写

if (field1 != null ? field1.equals(myClass.field1) : myClass.field1 == null)

这样的繁琐代码,大大简化了重写过程,也减少了出错的可能。

为什么

String

、

Integer

等包装类要重写

equals()

,它们对

HashMap

和

HashSet

有什么影响?

String

和

Integer

这些类重写

equals()

方法,完全是为了符合我们人类对“相等”的直观理解。试想一下,如果两个字符串内容都是 “hello”,但因为它们

以上就是Java中==和equals()方法的区别是什么?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/89683.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
忘记无线密码?3步快速找回
上一篇 2025年11月18日 06:35:23
360极速浏览器如何导出书签为HTML文件_360极速浏览器备份收藏夹到HTML文件
下一篇 2025年11月18日 06:37:25

相关推荐

  • AcerSwift笔记本处理蓝屏代码0x00000078的步骤指南。

    AcerSwift笔记本处理蓝屏代码0x00000078的步骤指南。AcerSwift笔记本处理蓝屏代码0x00000078的步骤指南。AcerSwift笔记本处理蓝屏代码0x00000078的步骤指南。AcerSwift笔记本处理蓝屏代码0x00000078的步骤指南。

    蓝屏错误0x00000078通常因系统文件或驱动加载失败引起,可依次尝试安全模式诊断、运行SFC和CHKDSK修复系统与磁盘错误、更新驱动程序、执行系统还原及使用启动修复工具解决。 如果您的Acer Swift笔记本在使用过程中出现蓝屏,并显示错误代码0x00000078,这通常与系统启动时无法正确…

    2026年10月3日 • 用户投稿
    100
  • Notion AI新用户必看:5分钟上手基础写作与总结

    Notion AI新用户必看:5分钟上手基础写作与总结Notion AI新用户必看:5分钟上手基础写作与总结Notion AI新用户必看:5分钟上手基础写作与总结Notion AI新用户必看:5分钟上手基础写作与总结

    notion ai可通过掌握指令系统、使用模板、迭代优化、善用总结功能及认识局限性来快速生成高质量内容。首先熟悉基础指令并自定义以适应不同写作风格;其次从预设模板入手了解应用场景;随后对ai生成内容进行多次修改优化;利用ai总结功能提取关键信息;同时注意核实事实避免错误。针对博客写作,需结合选题研究…

    2026年10月3日 • 用户投稿
    000
  • win11连接不上蓝牙耳机怎么办_蓝牙设备连接失败修复指南

    win11连接不上蓝牙耳机怎么办_蓝牙设备连接失败修复指南win11连接不上蓝牙耳机怎么办_蓝牙设备连接失败修复指南win11连接不上蓝牙耳机怎么办_蓝牙设备连接失败修复指南win11连接不上蓝牙耳机怎么办_蓝牙设备连接失败修复指南

    首先运行系统内置蓝牙疑难解答,若无效则检查并启动蓝牙支持服务,接着更新或重新安装蓝牙驱动程序,最后重置蓝牙适配器并重新配对设备。 如果您尝试在Windows 11系统中连接蓝牙耳机,但设备无法被发现或连接失败,可能是由于驱动问题、服务未启动或设置错误导致。以下是针对此问题的多种解决方案。 本文运行环…

    2026年10月3日 • 用户投稿
    100
  • Java字符串压缩算法优化:处理末尾字符序列的策略

    本文深入探讨了字符串压缩算法,旨在将连续重复字符替换为字符加计数。我们将分析在实现此类算法时常见的末尾字符序列处理遗漏问题,并提供一个优化后的Java解决方案,确保所有字符序列都能被正确压缩,从而实现如“abbbccccc”到“ab3c4”的准确转换。 理解字符串压缩需求 字符串压缩是一种常见的数据…

    2026年10月3日
    300
  • composer的config命令常用配置项详解

    composer的config命令常用配置项详解composer的config命令常用配置项详解composer的config命令常用配置项详解composer的config命令常用配置项详解

    Composer config 命令用于管理项目配置,如仓库源、缓存路径、认证信息等。1. repositories 可添加私有仓库或镜像源;2. home 设置全局存储目录;3. cache-dir 指定缓存路径;4. http-basic 配置私有仓库认证;5. autoloader-suffi…

    2026年10月3日 • 用户投稿
    100
  • composer插件(plugin)的开发入门_介绍开发composer插件的基本步骤

    composer插件(plugin)的开发入门_介绍开发composer插件的基本步骤composer插件(plugin)的开发入门_介绍开发composer插件的基本步骤composer插件(plugin)的开发入门_介绍开发composer插件的基本步骤composer插件(plugin)的开发入门_介绍开发composer插件的基本步骤

    开发Composer插件需创建type为composer-plugin的包,实现PluginInterface接口,并通过extra.class指定入口类,在activate方法中注册事件或命令。示例中插件监听post-install-cmd事件,执行自定义逻辑,可通过path仓库本地测试,使用co…

    2026年10月3日 • 用户投稿
    200
  • win10夜间模式打不开怎么办_Win10夜间模式开关灰色无法启用的修复方法

    win10夜间模式打不开怎么办_Win10夜间模式开关灰色无法启用的修复方法win10夜间模式打不开怎么办_Win10夜间模式开关灰色无法启用的修复方法win10夜间模式打不开怎么办_Win10夜间模式开关灰色无法启用的修复方法win10夜间模式打不开怎么办_Win10夜间模式开关灰色无法启用的修复方法

    如果您尝试在Windows 10中启用夜间模式,却发现该功能开关呈现灰色且无法点击,这通常与系统服务、显卡驱动或相关设置异常有关。以下是解决此问题的具体步骤: 本文运行环境:Dell XPS 13,Windows 10 专业版 一、检查并启动必要系统服务 夜间模式依赖于特定的后台服务运行,若这些服务…

    2026年10月3日 • 用户投稿
    200
  • 如何从坏掉的SSD中恢复数据?借助专业工具提取固态硬盘数据

    如何从坏掉的SSD中恢复数据?借助专业工具提取固态硬盘数据如何从坏掉的SSD中恢复数据?借助专业工具提取固态硬盘数据如何从坏掉的SSD中恢复数据?借助专业工具提取固态硬盘数据如何从坏掉的SSD中恢复数据?借助专业工具提取固态硬盘数据

    发现SSD无法识别或读取失败时,应立即停用并断开连接,通过磁盘管理判断损坏类型;若为逻辑故障,使用嗨格式数据恢复大师等专业软件深度扫描并以只读模式挂载避免覆盖;若为物理损坏如主控或闪存故障,需送至配备PC-3000 Flash等设备的专业机构进行芯片级恢复,成本通常超2000元。 如果您发现SSD无…

    2026年10月3日 • 用户投稿
    100
  • 抖音主播怎么创建粉丝群?抖音如何创建粉丝群

    抖音已成为众多主播展示才华、积累粉丝的重要平台。而粉丝群作为主播与粉丝互动的关键渠道,正逐渐成为社群营销的新热点。那么,抖音主播如何创建粉丝群,打造高效的社群营销阵地呢?本文将从多个角度详细说明。 一、粉丝群的优势不容忽视 提升粉丝黏性粉丝群为主播提供了一个与粉丝深度互动的空间,通过日常交流和分享,…

    2026年10月3日
    100
  • Self Forcing— Adobe联合德克萨斯大学推出的视频生成模型

    Self Forcing— Adobe联合德克萨斯大学推出的视频生成模型Self Forcing— Adobe联合德克萨斯大学推出的视频生成模型Self Forcing— Adobe联合德克萨斯大学推出的视频生成模型Self Forcing— Adobe联合德克萨斯大学推出的视频生成模型

    self forcing 是由 adobe research 联合德克萨斯大学奥斯汀分校推出的全新自回归视频生成算法,旨在解决传统生成模型在训练与测试阶段存在的暴露偏差问题。该方法通过在训练过程中模拟自生成机制,以先前生成的帧作为条件生成后续帧,而非依赖真实帧,从而有效缩小了训练与测试分布之间的差异…

    2026年10月3日 • 用户投稿
    100
  • 谷歌浏览器怎么重置所有设置_谷歌浏览器恢复默认设置操作方法

    谷歌浏览器怎么重置所有设置_谷歌浏览器恢复默认设置操作方法谷歌浏览器怎么重置所有设置_谷歌浏览器恢复默认设置操作方法谷歌浏览器怎么重置所有设置_谷歌浏览器恢复默认设置操作方法谷歌浏览器怎么重置所有设置_谷歌浏览器恢复默认设置操作方法

    首先重置浏览器设置可解决运行异常问题。通过设置菜单选择“将设置还原为默认设置”并确认重置,适用于配置错误;若开发者工具异常,则在F12面板中点击“Restore defaults and reload”;若因配置文件损坏导致重置失败,需重命名“Default”文件夹以重建配置,或调整“Secure …

    2026年10月3日 • 用户投稿
    100
  • 显存差了4GB 玩家为何仍选择RTX 5070而非RX 9070:老外分析四大原因

    显存差了4GB 玩家为何仍选择RTX 5070而非RX 9070:老外分析四大原因显存差了4GB 玩家为何仍选择RTX 5070而非RX 9070:老外分析四大原因显存差了4GB 玩家为何仍选择RTX 5070而非RX 9070:老外分析四大原因显存差了4GB 玩家为何仍选择RTX 5070而非RX 9070:老外分析四大原因

    9月14日消息,amd的rx 9070虽然与nvidia rtx 5070定价相近,并拥有更大的显存容量和略微领先的游戏性能,但rtx 5070的市场销量依然大幅领先于rx 9070。 针对此现象,wccftech总结了四个关键原因。 DLSS 4生态更成熟,图像增强技术普及率更高 如今,图像超分技…

    2026年10月3日 • 用户投稿
    1700
  • win11控制面板在哪里打开_多种打开控制面板的路径

    win11控制面板在哪里打开_多种打开控制面板的路径win11控制面板在哪里打开_多种打开控制面板的路径win11控制面板在哪里打开_多种打开控制面板的路径win11控制面板在哪里打开_多种打开控制面板的路径

    1、通过Win+R输入control命令可快速启动控制面板;2、使用任务栏搜索“控制面板”并点击结果打开;3、在文件资源管理器地址栏输入“控制面板”或shell:ControlPanelFolder;4、在桌面创建控制面板快捷方式;5、从开始菜单的Windows工具文件夹中启动;6、在设置应用内搜索…

    2026年10月3日 • 用户投稿
    200
  • qq浏览器打印预览显示不全_qq浏览器打印预览显示不全问题解决方法

    qq浏览器打印预览显示不全_qq浏览器打印预览显示不全问题解决方法qq浏览器打印预览显示不全_qq浏览器打印预览显示不全问题解决方法qq浏览器打印预览显示不全_qq浏览器打印预览显示不全问题解决方法qq浏览器打印预览显示不全_qq浏览器打印预览显示不全问题解决方法

    1、调整打印预览缩放比例至“适合页面”或手动设为85%-90%;2、修改页边距为“无”或自定义为5mm;3、启用兼容性视图以修复老旧网页布局;4、安装高速渲染组件提升解析完整性;5、先另存为PDF再打印,确保内容完整。 如果您在使用QQ浏览器进行打印预览时发现页面内容显示不全,可能是由于页面缩放、边…

    2026年10月3日 • 用户投稿
    100
  • Java程序处理空白输入和数值符号的正确姿势

    Java程序处理空白输入和数值符号的正确姿势Java程序处理空白输入和数值符号的正确姿势Java程序处理空白输入和数值符号的正确姿势Java程序处理空白输入和数值符号的正确姿势

    本文旨在指导开发者如何编写Java程序,使其能够正确读取并处理包含空白字符的输入,并判断数值的正负号。通过使用try-catch块捕获NumberFormatException,程序可以优雅地处理空白输入或无法转换为数字的输入,避免程序崩溃,并给出友好的提示信息。同时,本文还展示了如何使用Float…

    2026年10月3日 • 用户投稿
    900
  • composer如何在一个laravel项目中安全地升级依赖_说明安全升级Laravel项目依赖的方法

    composer如何在一个laravel项目中安全地升级依赖_说明安全升级Laravel项目依赖的方法composer如何在一个laravel项目中安全地升级依赖_说明安全升级Laravel项目依赖的方法composer如何在一个laravel项目中安全地升级依赖_说明安全升级Laravel项目依赖的方法composer如何在一个laravel项目中安全地升级依赖_说明安全升级Laravel项目依赖的方法

    答案:升级Laravel依赖需先检查当前依赖状态,遵循官方升级路径逐步迁移,优先在隔离环境测试,采用渐进式更新策略,分批更新并提交composer.lock,确保兼容性与稳定性,最后清理缓存。 在Laravel项目中使用Composer升级依赖时,安全是首要考虑的因素。盲目执行composer up…

    2026年10月3日 • 用户投稿
    100
  • win11如何开启远程协助 win11开启和使用远程协助教程

    win11如何开启远程协助 win11开启和使用远程协助教程win11如何开启远程协助 win11开启和使用远程协助教程win11如何开启远程协助 win11开启和使用远程协助教程win11如何开启远程协助 win11开启和使用远程协助教程

    首先启用远程桌面或快速助手,再配置组策略与防火墙规则。具体为:通过设置开启远程桌面,使用快速助手生成安全码邀请协助;专业版用户可用组策略编辑器启用请求与提供协助策略;最后在防火墙中允许远程协助和远程桌面通过专用网络,确保连接畅通。 如果您希望让他人远程协助您解决电脑问题,或您需要协助他人处理其Win…

    2026年10月3日 • 用户投稿
    400
  • 解决composer更新时因”abandoned”包引发的警告

    解决composer更新时因”abandoned”包引发的警告解决composer更新时因”abandoned”包引发的警告解决composer更新时因”abandoned”包引发的警告解决composer更新时因”abandoned”包引发的警告

    应尽快替换已废弃的PHP依赖包以确保项目安全。首先通过composer show –tree检查废弃包是否为核心依赖,并查看其官方页面是否有推荐替代方案;优先迁移到活跃的fork版本或社区推荐包,如guzzle/guzzle应替换为guzzlehttp/guzzle;若暂无法替换,可临时…

    2026年10月3日 • 用户投稿
    100
  • win8系统备份与还原的完整教程_使用Win8自带工具进行数据备份

    win8系统备份与还原的完整教程_使用Win8自带工具进行数据备份win8系统备份与还原的完整教程_使用Win8自带工具进行数据备份win8系统备份与还原的完整教程_使用Win8自带工具进行数据备份win8系统备份与还原的完整教程_使用Win8自带工具进行数据备份

    通过创建系统映像和还原点,可在系统故障时快速恢复。首先在控制面板中启用系统保护并创建还原点,再通过“恢复”选项创建系统映像备份至硬盘或网络位置;当系统无法启动时,使用系统修复介质进入WinRE进行系统映像恢复,若系统仍可运行但异常,则通过恢复界面选择还原点执行系统还原,从而在不丢失文件的前提下修复问…

    2026年10月3日 • 用户投稿
    100
  • 豆包ai怎么创作歌词 豆包ai歌词创作指南

    豆包ai怎么创作歌词 豆包ai歌词创作指南豆包ai怎么创作歌词 豆包ai歌词创作指南豆包ai怎么创作歌词 豆包ai歌词创作指南豆包ai怎么创作歌词 豆包ai歌词创作指南

    豆包ai虽非专为歌词创作设计,但其强大的文本生成能力可有效辅助歌词创意、押韵优化及风格多样化。1. 可通过输入关键词或具体情境获取歌词灵感;2. 可请求优化押韵和句子结构以提升音乐性;3. 可生成不同风格版本便于选择与融合。掌握提问技巧能让豆包ai更贴合创作需求,多加尝试将提升辅助效果。 ☞☞☞AI…

    2026年10月3日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信