当前位置: 首页 > news >正文

01_Long比较值 类型相同值不同

问题描述:

看如下代码:

Long a = 128L;
Long b = 128L;System.out.println(a == b);

运行结果如下:

明明 ab 的值一样,但是结果却为 False,为什么同样的类型,同样的值,却不相等,这是为什么呢?

原因分析

那么我们就需要查看一下源码了

源码中显示,Long 中有一个静态的内部类 LongCache,专门用于缓存 -128127 之间的值,一共 256 个元素。

如果值在 [-128, 127] 之间,会放在缓存里面,而超过这个范围就要 new 一个新的对象,也就是说 == 不能判断对象是否相等。

当然,如果值是在 [-128, 127] 之间的话是可以正常比较,测不出来什么问题的。

故障解决

1. 使用 .longValue() 比较

Long a = 128L;
Long b = 128L;//System.out.println(a == b);
System.out.println(a.longValue() == b.longValue());

运行结果如下:

2. 使用 .equals() 比较

Long a = 128L;
Long b = 128L;//System.out.println(a == b);
//System.out.println(a.longValue() == b.longValue());
System.out.println(a.equals(b));

运行结果如下:

总结

Longlong 的包装类,而用 Long 声明的变量其实是对象。在 Java 中,== 运算符用于比较基本数据类型时,比较的是它们的值是否相等;但用于比较对象时,比较的是它们在内存中的地址是否相同。 对于 Long 类型来说,其内部存在 LongCache 这个静态内部类用于缓存 -128127 之间的值,一共 256 个元素。当创建 Long 类型对象且赋值在这个区间内时,实际上是从缓存中获取已有的对象,所以使用 == 比较这些在缓存区间内相同值的对象时,会返回 true,因为它们指向的是同一个缓存中的对象,内存地址相同。

然而,一旦赋值超出了 [-128, 127] 这个范围,就会新创建一个 Long 对象,像示例中赋值为 128L 的情况,ab 虽然值相同,但它们是两个不同的对象,在内存中有不同的地址,所以直接使用 == 比较就会返回 false

  • 通过使用 .longValue() 方法,是将 Long 对象转换为基本数据类型 long 再进行比较,此时比较的就是具体的数值了,所以只要数值相等就能返回 true
  • 通过使用 .equals() 方法时,Long 类重写了 Object 类的 equals() 方法,它是先通过 .longValue() 方法获取 Long 对象的基本类型 long 的值之后再做比较。

总之,在比较 Long 类型对象的值是否相等时,要谨慎使用 == 运算符,尽量采用.equals() 的方式来(或者是.longValue()的方式)确保比较的是实际的数值,避免因对象内存地址不同而导致比较结果不符合预期

相关文章:

  • 联想昭阳笔记本 风扇一键静音优化操作指南
  • RuoYi-Vue项目Docker镜像构建、推送与部署完整流程
  • FEKO许可安装
  • CF2096G Wonderful Guessing Game 构造
  • 强制缓存vs协商缓存
  • 2025系统架构师---黑板架构风格
  • element通过业务按钮点击导入,调用el-upload的导入方法
  • 日本IT|UIUX主要的工作都是哪些?及职业前景
  • 关于PyQt5信号槽机制的解析
  • Spring AOP 详解
  • ARCGIS PRO 在地图中飞行
  • (done) 吴恩达版提示词工程 9. 总结 (就是复述一遍前面的内容,以及建议你基于LLM开发应用程序)
  • 8、HTTPD服务--CGI机制
  • linux两个特殊的宏 _RET_IP_ 和_THIS_IP_ 实现
  • 第15节:传统分类模型-K近邻(KNN)算法
  • 【文献速递】snoRNA-SNORD113-3/ADAR2通过对PHKA2的A-to-I编辑影响胶质母细胞瘤糖脂代谢
  • Nginx配置文件介绍
  • 创建一个springboot的项目-简洁步骤
  • 【前端基础】viewport 元标签的详细参数解析与实战指南
  • 【项目实训个人博客】multi-agent调研(1)
  • 河南博物院:警惕非官方网络平台 “买讲解保进馆” 等虚假信息
  • 美国鞋类巨头请求白宫豁免关税,称已构成“生存威胁”
  • 美“群聊泄密门”始作俑者沃尔兹将离职
  • 即日起,“应急使命·2025”演习公开征集新质救援能力
  • 上海科创再出发:“造星”的城和“摘星”的人
  • 美参议院通过新任美国驻华大使任命,外交部回应