Objects.equals有坑
发布日期:2025-04-27 11:52:23 浏览次数:3 分类:精选文章

本文共 1322 字,大约阅读时间需要 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的工作原理,并也意识到了类型不一致可能带来的问题。未来在开发代码时,会更加注意参数类型的检查,避免类似的问题再次发生。

上一篇:Object常用方法
下一篇:ObjectProperty 类的使用

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2025年04月06日 22时24分36秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章