使用equals遇到的bug

Objects.equals有坑 前言 最近review别人代码的时候,发现有个同事,在某个业务场景下,使用Objects.equals方法判断两个值相等时,返回了跟预期不一致的结果,引起了我的兴趣。 原本以为判断结果会返回true的,但实际上返回了false。 记得很早之前,我使用Objects.equals方法也踩过类似的坑,所以有必要把这个问题记录下来,分享给大家。 到底怎么回事呢? 1. 案发现场 假设现在有这样一个需求:判断当前登录的用户,如果是我们指定的系统管理员,则发送一封邮件。系统管理员没有特殊的字段标识,他的用户id=88 阅读详情
Long longValue = 123L;
System.out.println(longValue==123); //true
System.out.println(Objects.equals(longValue,123)); //false

为什么替换为Objects.equals()会导致不同的结果?这是因为使用编译器会得到封装类型对应的基本数据类型longValue,然后与这个基本数据类型进行比较,相当于编译器会自动将常量转换为比较基本数据类型, 而不是包装类型。
使用该Objects.equals()方法后,编译器默认常量的基本数据类型为int。下面是源码Objects.equals(),其中a.equals(b)使用的是Long.equals()会判断对象类型,因为编译器已经认为常量是int类型,所以比较结果一定是false。

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}
    
public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}

知道了原因,解决方法就很简单了。直接声明常量的数据类型,如Objects.equals(longValue,123L)。其实如果逻辑严密,就不会出现上面的问题。我们需要做的是保持良好的编码习惯。

激光三角测量法:斜射与直射式技术的原理与应用解析 本文深入解析激光三角测量法中斜射式与直射式技术的原理、应用及对比。斜射式适用于高精度小范围测量,尤其擅长处理反光表面;直射式则适合大范围位移检测,结构更简单。文章详细介绍了两种技术的光路分析、数学建模、应用场景及选型建议,并探讨了系统校准与误差分析方法,为工业检测领域提供实用参考。 阅读详情

相关推荐

飞牛fnOS安装1Panel后Docker容器消失?三步教你恢复数据并避免踩坑

本文详细解析了飞牛fnOS安装1Panel后Docker容器消失的问题,指出这是由于daemon.json文件被覆盖导致。通过SSH连接、修复配置文件和系统重启三个步骤,用户可以轻松恢复数据。文章还提供了预防措施和最佳实践,帮助用户避免类似问题。

yellow的专栏 873

Objects.equals小坑

问题描述 Integer a = 1; long b = 1L; System.out.println(Objects.equals(b, a)); //结果:false 原因分析: Integer的equals方法: public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; } 先判断参数obj是否是Integer类

qq_40844739的博客 587

叶绿体基因组提交NCBI全流程避坑指南

叶绿体基因组作为环状细胞器DNA,其数据提交并非简单上传,而是需严格遵循INSDC标准的学术出版行为。其核心原理在于元数据完整性、拓扑结构语义一致性与分类学路径精确匹配;技术价值体现在保障序列可追溯、可复现、可互操作;典型应用场景涵盖植物系统发育、条形码开发及合成生物学底盘构建。实践中,FASTA头行格式、feature table嵌套规则、taxid绑定及BankIt静默校验等环节极易引发失败。本文聚焦NCBI|叶绿体基因组数据上传中的高频报错与隐性约束,提供面向生物信息工程师的实操级规范解析。

weixin_31960565的博客 329

当Long型使用equals的时候出现的问题,无法判断怎么办?

1111 今天在写项目的时候,出现long型问题的判断 Long id = 1212121218888L; System.out.println(id.equals(1212121218888); // false System.out.printLn(id.equals(1212121218888L); // true 多了一个 L ,就是true了, 看源码可知: 1 public boolean equals(Object obj) { 2 if (obj instanceof Long

树暖 1589

RRAM/ Near Memory Computing (NMC) Survey - Reading Notes 0707

Reading Notes of Resistive Random Access Memory – Day 2 Chapter 3 RRAM Characterization and Modeling Overview of RRAM Physical Mechanism A general picture for the filamentary switching mechanism. Forming: 对本征RRAM样本,加电压VformingV_{forming}Vforming​,中间氧化层的O

Blog of Lucky H6 992

基于Codex与Skills的学术研究自动化全流程实战指南

还在为海量文献下载、整理、阅读和综述写作而头疼吗?面对堆积如山的PDF,你是否感到无从下手?从选题、文献检索、到写作、绘图、润色,再到应对AI检测和审稿意见,学术研究的每一步都充满挑战。本文将为你带来一套堪称“王炸组合”的解决方案: Codex + Skills 。这不是简单的工具介绍,而是一套从零开始,覆盖学术研究全流程的保姆级实战教程。我们将手把手教你如何安装、配置,并利用强大的Skills(技能)自动化处理文献下载管理、高效撰写综述、生成专业图表、智能润色降重,直至应对审稿。无论你是科研新手还是希望提

weixin_29041195的博客 765

Objects.equals 有坑!

Objects.equals 有坑!

浩浩的博客 1078

从零到飞:在Ubuntu 22.04上为你的无人机搭建PX4-Autopilot开发环境

本文详细指导在Ubuntu 22.04上搭建PX4-Autopilot开发环境,涵盖系统依赖安装、源码获取、编译目标选择及Gazebo仿真测试。通过优化构建过程和调试技巧,帮助开发者快速为无人机部署稳定的飞控系统,实现从仿真到实机的平滑过渡。

weixin_26878995的博客 490

对象之间的比较大小

对于Integer、Long这些对象比较大小,不能直接用==比较,可以用: Objects.equals()方法比较  

zhuifengnian的博客 639

YOLOv9改进,YOLOv9添加CBAM注意力机制

CBAM是一个简单而有效的注意力模块,用于前馈卷积神经网络。给定一个中间特征图,我们的模块按顺序推断两个独立维度(通道和空间)的注意力图,然后将注意力图乘以输入特征图以进行自适应特征细化。由于 CBAM 是一个轻量级的通用模块,因此它可以无缝集成到任何 CNN 架构中,开销可以忽略不计,并且可以与基础 CNN 一起进行端到端训练。论文链接:(CBAM论文)

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 857

在 Fiori Elements Object Page 的表格中用 UI.Hidden 隐藏列:语义、边界与落地实践全解析

摘要: Fiori Elements的Object Page表格中,UI.Hidden注解支持静态和动态隐藏列。动态隐藏分为两种:基于父实体属性隐藏整列,或基于子实体属性按行隐藏单元格。关键约束包括:支持服务端操作的列禁止使用动态隐藏,否则会导致UX不一致。ABAP CDS不支持路径式UI.Hidden,需改用XML注解。该功能需与UI.Importance、个性化等机制明确区分,避免混淆。对于可能参与排序/过滤的列,建议仅使用静态隐藏。实际应用中需注意注解位置(整列或单元格级)和业务场景的匹配。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 205

【BUG日记】【JAVA】使用==判断两个Integer类型的值,发现if语句不起作用(正确做法:使用的判断是equals()去判断)

【日期】: 2021/10/12 【问题】: 使用==判断两个Integer类型的值,发现if语句不起作用 【原因】: 在jdk源码中,使用==比较Integer类型时,默认会缓存 -128至127(包括-128和127),如果超过这个范围,则会new,所以两个对象内存的首地址不一样,==返回false.(参考资料:https://blog.youkuaiyun.com/cdsn_ttk/article/details/89359498) 【如何发现】: 出现if语句不生效的时候发现这个问题 【如何修复】: 百度查询资

南方者的博客 528

Manus创始人深度复盘:AI Agent产品的技术架构与战略转型

成本对比:同样任务处理,中国区单位成本是亚太区的2.3倍。付费转化率:中国区1.2% vs 全球平均4.7%微信/支付宝等超级App的适配代码占比达17%Zstandard:压缩比38%,耗时12ms。每季度需要投入3名高级工程师专职维护兼容性。国际版API平均延迟:180-220ms。中国版特殊部署延迟:480-720ms。信息保持准确率:93%(7天跨度测试)自研算法:压缩比39%,耗时5ms。存储效率:相比纯文本节省68%空间。:本地化部署导致的延迟与费用差异。LZ4:压缩比42%,耗时8ms。

m0_75253143的博客 7147

equals和hashcode

我在使用findbugs的时候,发现了自己程序中的一个bug: EQ_SELF_USE_OBJECT Bug: defines equals method and uses Object.equals(Object) 这说的是在写.equals函数的时候,传递的参数需要用object类,否则就不是重写,不能覆盖父类的equals。 于是我想到我对equals和hashcode这点当时就没怎么学明白...

weixin_43722458的博客 401

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java equals覆盖,覆盖java equals()方法 - 不工作?

I ran into an interesting (and very frustrating) issue with the equals() method today which caused what I thought to be a well tested class to crash and cause a bug that took me a very long time to tr...

weixin_34550241的博客 82

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java中为什么重写equals方法就一定要重写hashcode?

在 Java 中,​equalshashCode​,这主要是为了​​,尤其是equals和hashCode方法之间的约定。如果不这样做,可能会导致程序出现难以察觉的 bug,尤其是在使用基于哈希的集合类(如HashMapHashSetHashtable等)时。

qq_57019146的博客 461

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

为什么两个看似相等的 Integer 却不相等?一次诡异的缓存折扣商品 BUG 排查

我们在今天的代码审查中,我发现了新来的同事小龙写了这样一段逻辑,用于判断当前商品是否为后台设置的折扣商品引发了BUG,这次折扣商品匹配 BUG 的根源在于 把 == 用于 Integer 对象比较。由于 Java 的 Integer 缓存机制,小整数可以“碰巧”相等,而大整数则不会,从而导致了诡异的 BUG

Micro麦可乐的博客 5477

C#代码质量改善建议(六)——“ ==”与“Equals”

这是因为基于键值的集合Dictionary会根据Key值寻找Value值,实际上根据Key值的HasCode查找Value,当我们不重写GetHashCode值时,调用的是Object类型默认的GetHashCode方法,该方法会给每一个new对象生成一个固定的整型值,该值在对象的生存周期不会发生改变。可能会存在潜在的Bug,所以除非考虑到自定义类型会被用作基于散列的集合的键值,否则不建议重写Equals.HashCode还存在一个问题,它返回的是一个整型类型,显然无法满足字符串的容量。

weixin_45496521的博客 513

==和equals有什么区别?看不懂隔着网线过来打我

本文通过一个实际案例详细解析了Java中==、equals和hashCode的区别与联系。作者在工作中遇到两个内容相同的用户对象用==比较不相等的问题,发现==比较的是对象内存地址而非内容。随后尝试用equals仍失败,发现默认继承Object类的equals本质上仍是==比较,必须重写该方法。最后使用HashSet时发现仍需重写hashCode,因为哈希集合依赖hashCode定位对象。文章强调Java的铁律:重写equals必须同时重写hashCode,并总结了三个概念的本质区别:==比较身份、equa

m0_73889530的博客 400

一次价值千元的Bug:Long类型比较的陷阱与思考

摘要:文章剖析了一个由Java包装类比较引发的线上事故。当用户ID超过127后,使用==比较Long对象开始失效,根源在于Java的整数缓存机制(-128到127)。作者对比了三种修复方案,推荐使用Objects.equals()方法,并总结了经验教训:基础知识的深度理解至关重要,测试需覆盖边界场景,团队应建立包装类比较规范。文章强调编程中最大的风险往往来自看似简单的操作陷阱,建议通过静态检查工具和公用方法确保代码安全。

weixin_73740443的博客 953

Integer缓存机制详解:“==“与equals的比较陷阱

值比较原则:包装类比较始终优先使用equals()方法明确比较意图:需要比较数值时,考虑显式拆箱代码审查重点:特别关注边界值(128、-129等)的比较逻辑团队规范统一:制定统一的包装类比较规范测试覆盖:确保边界情况的测试用例覆盖理解Integer缓存机制不仅有助于避免常见的比较陷阱,更能加深对Java内存模型、自动装箱机制和性能优化设计的理解,是每个Java开发者应该掌握的重要知识点。

2501_93078354的博客 446

伙伴匹配bug:Long类型id比较bug

Long类型id直接 “==” 判断值,结果项目测试一直达不到预期。和Integer差不多。

qq_59957669的博客 133

关于Integer引发的查询bug

记录依次关于Integer特性引发的bug: 数据库的表有id以及parent_id字段,后续会生成一个树型的List结构。 首先原来的关键代码如下:root节点是0. public <T extends TreeNode> List<T> build(List<T> treeNodes, Object root) { List<T> trees = new ArrayList<>(); for (T treeNode : treeNode

qq_45449956的博客 1228

【强制】所有的相同类型的包装类对象之间值的比较,全部使用 equals 方法比较。如何理解?

包装类==比「地址」,equals 比「数值」,这是核心区别;Integer-128~127 有缓存,== 看似可用,但这是「特例」不是「规则」;避开缓存特例的坑,统一代码规范,适配所有数值场景;所有包装类(Integer、Long、Float 等)的相同值比较,都按这个规则来。

魏波 1033

Hibernate Bean的Equals方法重载问题

代码如下: [code="java"] /** * 判断当前流程实例上下文中,是否存在Blocking(阻挡性)的任务 * 规则 * 1.任务未结束 * 2.任务是必办理的 * 3.当前任务实例的token和执行上下文的token一致 * @param token * @return */ public boolean hasBlo...

linliangyi2006的专栏 164

开发日记:stream入门,树形菜单功能的实现及bug修复

1、需求: 有一个菜单表,字段catId用于唯一标识每一条记录,每一条记录代表一个菜单项;另有parentCid用于记录该记录的父级菜单,现需为每个菜单绑定他们的子菜单,表结构如下 CREATE TABLE `pms_category` ( `cat_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '分类id', `name` char(50) DEFAULT NULL COMMENT '分类名称', `parent_cid` bigint(2...

程序猿一只 740
上一篇: 用策略模式做文件上传
下一篇: 使用HashSet去除重复数据,没有重写hashcode方法和equals方法
pywanggui
博客等级 码龄12年 6粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pywanggui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值