使用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)。其实如果逻辑严密,就不会出现上面的问题。我们需要做的是保持良好的编码习惯。

深入解析ViT中的RoPE旋转位置编码:原理、实现与视觉应用 本文深入解析了ViT中的RoPE旋转位置编码原理、实现及其在视觉任务中的应用。RoPE通过旋转变换巧妙地将相对位置信息融入注意力计算,解决了传统绝对位置编码外推性差的问题,在图像分类、目标检测及生成任务中展现出更优的泛化能力和灵活性。 阅读详情

相关推荐

华为P812E光猫补全shell配置PON口模式

终于看到华为企业级的带2.5电口P812E横空出世了,相信很多发烧友也已经将此收入昂中。相信体验的同时,遇到的第一件事情就是配置PON口模式的问题,本文将带发烧基友解锁模式。

GUAIYU的博客 5736

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

Multisim仿真电路:(十二)MOS管缓启动电路设计与优化

本文详细介绍了基于Multisim的MOS管缓启动电路设计与优化方法。通过分析米勒平台效应,探讨RC参数选择、多级设计和有源电路等技巧,有效抑制冲击电流并优化开关损耗。文章结合仿真实例,提供实用的设计策略和实际应用注意事项,帮助工程师提升电源管理系统的可靠性。

pytorch8learner的博客 237

当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

智能车八邻域图像算法_二

智能车八邻域图像算法 文章目录智能车八邻域图像算法前言一、一些想法二、生长方向的使用1.点的生长方向的表示2. 用点的生长方向来做初步判断1.引入库2.读入数据总结 前言 上一篇里面讲过用八邻域来获得赛道边界:智能车八邻域图像算法 当已经能稳定获得赛道边界时,就可以进行元素识别,获得偏差了。 这里就介绍一下我的一些思路。 早在前两年,优快云上就有一篇关于八邻域如何处理元素的文章第十五届全国大学生智能汽车竞赛-双车组三轮图像处理总结,写得很好,我当时也参考了这篇文章,但是我觉得不是很详细,所以我这里想写得

技术缝合怪的博客 1万+

科研笔记:怎样写好博士论文?

博士论文外审避坑指南与写作要点 博士论文外审的核心关注点呈现5级优先级:科研成果(硬指标)>创新性>逻辑结构与场景合理性>文献综述与规范性>工作量验证。外审专家会重点核查:1)成果清单是否达标;2)创新点是否真实明确;3)章节逻辑是否自洽、应用场景是否细化;4)文献综述是否构建"研究坐标系";5)实验/理论支撑是否充分。需特别注意三大雷区:科学错误(直接挂稿)、伪创新、场景不合理。写作时应强化选题依据的场景细化,通过"发展阶段+跨领域对比"提升文献综述质量。

Grow into a more wonderful you 1065

Objects.equals 有坑!

Objects.equals 有坑!

浩浩的博客 1078

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第1套模块A:网络构建 & (五)无线网络配置+(六)出口网络配置-命令配置

【赛题解析&命令脚本配置】2023年全国职业院校技能大赛GZ073网络系统管理赛项赛题第1套模块A:网络构建 & (五)无线网络配置+(六)出口网络配置-命令配置

君逍遥o 408

对象之间的比较大小

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

zhuifengnian的博客 639

C++ PCL点云处理实战专栏

工业级点云处理技术学习资源,涵盖电力、建筑、隧道等领域的实战案例。内容分为三阶段:代码原理(算法认知)、动态库(项目验证)和完整代码(定制开发)。

weixin_45196569的博客 1118

从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果

通过colmap进行的sfm的普通方式会丢失场景的物理尺度信息,并且并不在符合一般认知的坐标系下,本文将读取colmap生成的点云和相机pose,将其进行空间变换和缩放之后,重新保存,新保存的结果仍然可以被colmap读取以及进行后续的稠密重建以及3dgs等工作

诺有缸的高飞鸟的博客 1424

【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

ZYNQ PL通过EMIO ETHE1外接PHY由GMII转RGMII

1,设置EMIO方式引出ETHE1 2,从GMII过度到RGMII GMII: 发送 gmii_tx_clk gmii_tx_d[7:0] gmii_tx_en gmii_tx_er 接收 gmii_rx_clk gmii_rx_d[7:0] gmii_rx_dv gmii_rx_er RGMII: 发送 tx_clk tx_d[3:0] tx_ctrl 接收 rx_clk rx_d[3:0] rx_ctrl 首先数据总线从时钟单边沿采样8bit转变为了双边沿采样4bit,从88E1

wangjie36的博客 1万+

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

qq_57019146的博客 461

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

为什么两个看似相等的 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、付费专栏及课程。

余额充值