博客
关于我
Objects.equals有坑
阅读量:796 次
发布时间:2023-02-22

本文共 1305 字,大约阅读时间需要 4 分钟。

最近在帮同事解决一个代码问题时,发现他们在使用Objects.equals方法判断两个值是否相等时遇到了意外的结果。原本以为返回true,但实际上返回了false。这让我对Objects.equals的工作原理产生了很大兴趣。

首先,回顾Objects.equals的用途。这个方法是用来判断两个对象是否相等的,能够避免直接使用==号带来的空指针问题。它内部的逻辑是先比较两个对象的引用是否相等,如果相等就返回true,否则检查其中一个对象是否为空,如果一个为空,另一个不为空,则返回false。只有当两个对象都不为空时,才会调用其中一个对象的equals方法来进一步判断值是否相等。

然而,在某个案例中,使用Objects.equals返回了false。案例代码如下:

UserInfo userInfo = CurrentUser.getUserInfo();if (Objects.isNull(userInfo)) {    log.info("请先登录");    return;}if (Objects.equals(userInfo.getId(), 888)) {    sendEmail(userInfo);}

UserInfo类的id字段是Long类型,而888是int类型。这导致了比较时类型不一致,Objects.equals返回false。

进一步分析,发现当两个参数类型不一致时,Objects.equals会返回false。例如:

Integer a = 1;long b = 1L;Objects.equals(a, b); // 返回false

解决方法是确保两个参数的类型一致。可以通过类型强制转换来实现:

Integer a = 1;long b = 1L;Objects.equals(a, (int) b); // 返回true

或者:

Integer a = 1;long b = 1L;Objects.equals(b, (long) a); // 返回true

此外,直接使用==号也可以比较基本类型和它们的包装类,但需要注意包装类的比较是否正确。例如:

int a = 1;Integer b = 1;System.out.println(a == b); // 返回true

但是,如果使用包装类的equals方法:

Integer a = 1;long b = 1L;System.out.println(a.equals(b)); // 返回false

因为a的类型是Integer,而b是long,所以调用Integer的equals方法时,会首先检查参数是否是Integer,如果不是,就直接返回false。

总结:使用Objects.equals方法时,必须确保两个参数的类型一致,否则会导致错误判断。直接使用==号在不同类型之间也可能出错,特别是在包装类之间需要谨慎处理。

通过这次经历,深刻理解了Objects.equals的工作原理,并也意识到了类型不一致可能带来的问题。未来在开发代码时,会更加注意参数类型的检查,避免类似的问题再次发生。

转载地址:http://cssfk.baihongyu.com/

你可能感兴趣的文章
Office办公软件里的“开发工具”选项卡-ChatGPT4o作答
查看>>
Office开发工具选项卡中的控件-ChatGPT4o作答
查看>>
Offline Installation the .NET Framework 3.5 on Windows 8
查看>>
OGC服务标准(地图资料篇.3)
查看>>
OGG初始化之使用数据库实用程序加载数据
查看>>
ogg参数解析
查看>>
ognl详解
查看>>
Ogre 插件系统
查看>>
Oil Deposits
查看>>
oj2894(贝尔曼福特模板)
查看>>
OJ4TH|Let's play a game
查看>>
OJ中处理超大数据的方法
查看>>
OJ中常见的一种presentation error解决方法
查看>>
OK335xS UART device registe hacking
查看>>
ok6410内存初始化
查看>>
OkDeepLink 使用教程
查看>>
OKHTTP
查看>>
Okhttp3中设置超时的方法
查看>>
Okhttp3添加拦截器后,报错,java.io.IOException: unexpected end of stream on okhttp3.Address
查看>>
okhttp3缓存
查看>>