浅谈Java包装类型Long的==操作引发的低级bug

本文主要介绍了浅谈Java包装类型Long的==操作引发的低级bug,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

浅谈Java包装类型Long的==操作引发的低级bug,久久派带你了解更多相关信息。

目录
  • 背景
  • 两个 Long 类型的 ==
  • 对 Collections.EMPTY_SET 进行 add 引发的异常
  • Collections 的空集合使用注意事项
  • 启示录

背景

一个简单的列表检索功能,列表元素有一个 Long 类型的属性,遍历过程中犯了一个低级错误,导致功能流程始终错误,本文将分享两个低级错误引发的 bug。

两个 Long 类型的 ==

查找某个元素 A 在列表 B 中对应的对象的时候,根据元素主键查询,主键类型为包装类型 Long ,遍历流程如下:

for(MyData temp:b){     if (temp.getId() == a.getId() { //  MyData 的 id 属性为 Long 类型          return temp;     }}

这么一段简单的查找代码,结果怎么都找不到目标对象,断点调试发现问题出在 == 操作上,改成 equals 就可以了。

关于 Java Long 的包装类型和元素类型的判断相等的操作回顾:

Long a = 81487354807713792L;Long b = 81487354807713792L;System.out.println(a==b); // falseSystem.out.println(a.equals(b)); // truelong c = 81487354807713792L;long d = 81487354807713792L;System.out.println(c==d); // true

对 Collections.EMPTY_SET 进行 add 引发的异常

另一个低级错误是对 Collections.EMPTY_SET 进行 add 引发的,需要合并两个集合,第一个集合 A 可能是

Collections.EMPTY_SET ,最终将另一个集合 B 合并到 A 得到一个大集合。Set<MyData> a = getDatas();// 如果为空,返回了 Collections.EMPTY_SETSet<MyData> b = getDatas1();a.addAll(b);

当集合 a 为集合的空对象时,操作异常:

Exception in thread \”main\” java.lang.UnsupportedOperationException
at java.util.AbstractCollection.add(AbstractCollection.java:262)

修正方式:如果需要直接对一个集合进行 add ,就不能用 Collections.EMPTY_SET。

Collections 的空集合使用注意事项

以 Collections.EMPTY_SET 为例,跟源码它的定义主要是下面三行代码:

public static final Set EMPTY_SET = new EmptySet<>();private static class EmptySet<E> extends AbstractSet<E>AbstractSet<E> extends AbstractCollection

核心在于 AbstractCollection 类的 add,默认直接抛出了异常,限制了空集合不允许添加:

public boolean add(E e) {     throw new UnsupportedOperationException(); }

结论:java.util.Collections 类中所有的 EMPTY_XXX 对象都不能进行 add 操作。

启示录

定位到这两个低级错误后,想起那句调侃:代码编写分分钟,bug 查找两小时。这两个问题恰好是一个比较复杂的流程的一部分,构建环境进行测试,测一次差不多十几分钟,加上机器怠工,跟这俩小问题,耗了两个小时。

到此这篇关于浅谈Java包装类型Long的==操作引发的低级bug的文章就介绍到这了,更多相关Java Long的==内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

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

(0)
nan
上一篇 2021-08-23
下一篇 2021-08-23

相关推荐

发表回复

登录后才能评论