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()的方式)确保比较的是实际的数值,避免因对象内存地址不同而导致比较结果不符合预期

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EKS环境下服务重启50X错误

EKS中,当使用AWS Load Balancer Controller时,ALB有两种模式,Internet-facing和Internet,当使用Internet模式时,ALB注册的是NodeIP;使用Internet-facing模式时,ALB注册的则是Pod IP。从模式上来…

Android项目升级插件到kotlin 2.1.0后混淆网络请求异常

背景 项目kt插件1.9.24升级到2.1.0后打包编译release网络请求失败了。 retrofit版本2.9.0 错误详情 java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedTypeat retrofit2.m.a(Unknown Source:2477)at retrofit2.K.invoke(U…

Vue中Axios实战指南:高效网络请求的艺术

Axios作为Vue生态中最流行的HTTP客户端,以其简洁的API和强大的功能成为前后端交互的首选方案。本文将带你深入掌握Axios在Vue项目中的核心用法和高级技巧。 一、基础配置 1. 安装与引入 npm install axios 2. 全局挂载(main.js) import …

Flink维表深度解析

一、维表的概念与作用 维表(Dimension Table) 是数据仓库中的核心概念,通常用于存储静态或缓慢变化的业务实体信息(如用户资料、商品信息、地理位置等)。在实时流处理场景中,维表的作用是为主数据流&#…

SKLearn - Biclustering

文章目录 Biclustering (双聚类)谱二分聚类算法演示生成样本数据拟合 SpectralBiclustering绘制结果 Spectral Co-Clustering 算法演示使用光谱协同聚类算法进行文档的二分聚类 Biclustering (双聚类) 关于双聚类技术的示例。 谱…

PostSwigger Web 安全学习:CSRF漏洞2

CSRF 漏洞学习网站:What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF 漏洞:SameSite相关绕过 当浏览器访问服务器时,服务器会在 Cookie 中添加 SameSite 属性来告诉浏览器是否在来自其他…

从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征

从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征 第一部分:概率与统计基础 第2节:数字特征:期望值、方差、协方差与相关系数 一、期望值(Expected Value)&#xff1a…

MySQL(聚合函数)

单行函数 对每一条记录输入值进行计算,得到相应的计算结果,返回给用户,也就是说,每条记录作为一个输入参数,经过函数计算得到每条记录的计算结果。 每一个函数中都有一些常用的函数(方法) 在学…

babel核心知识点

Babel 是一个 JavaScript 编译器,主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript 代码,以便在旧版本的浏览器或环境中运行。以下是 Babel 的核心知识点: 1. 基本概念 编译器:Babel 本质上是一个编译器&…

javaScript--数据结构和算法

在 JavaScript 里,数据结构和算法是十分关键的部分,下面介绍几种常见的数据结构和对应的算法。 数组(Array) 数组是最基础的数据结构,用于存储一系列有序的数据。 // 创建数组 const arr [1, 2, 3, 4, 5];// 访问元素…

π0.5:带开放世界泛化的视觉-语言-动作模型

25年4月来自具身机器人创业公司 PI 公司的论文“π0.5: a Vision-Language-Action Model with Open-World Generalization”。 为了使机器人发挥作用,它们必须在实验室之外的现实世界中执行实际相关的任务。虽然视觉-语言-动作 (VLA) 模型在端到端机器人控制方面已…

使用 OpenCV 和 dlib 进行人脸检测

文章目录 1. 什么是 dlib2. 前期准备介绍2.1 环境准备2.2 dlib 的人脸检测器 3. 代码实现3.1 导入库3.2 加载检测器3.3 读取并调整图像大小3.4 检测人脸3.5 绘制检测框3.6 显示结果 4. 完整代码5. 优化与改进5.1 提高检测率5.2 处理 BGR 与 RGB 问题 6. 总结 人脸检测是计算机视…

spring 的PropertySource 类与 @PropertySource 注解详解与对比

PropertySource 类与 PropertySource 注解详解与对比 在这里插入图片描述 一、PropertySource 类详解 1. 类型与作用 类型:接口(org.springframework.core.env.PropertySource)作用:抽象配置数据源,提供统一的键值…

Java后端开发day37--源码解析:TreeMap可变参数--集合工具类:Collections

(以下内容全部来自上述课程) 1. TreeMap 1.1 须知 1.1.1 Entry 节点初始为黑色:提高代码阅读性 1.1.2 TreeMap中的成员变量 comparator:比较规则root:红黑树根节点的地址值size:集合的长度和红黑树…

基于Playwright的浏览器自动化MCP服务

一、服务定位与核心功能 github.com/executeautomation/mcp-playwright 是一个基于 Playwright(微软开源的跨浏览器自动化测试框架)的 Model Context Protocol (MCP) 服务,核心功能是将浏览器自动化能力集成到大语言模型(LLM&…

OSPF网络协议

OSPF(Open Shortest Path First)是一种链路状态路由协议,属于IGP(内部网关协议),用于在单一自治系统(AS)内动态分发路由信息。它通过计算最短路径(基于Dijkstra算法&…

Ubuntu 22.04.4操作系统初始化详细配置

上一章节,主要讲解了Ubuntu 22.04.4操作系统的安装,但是在实际生产环境中,需要对Ubuntu操作系统初始化,从而提高系统的性能和稳定性。 一、查看Ubuntu系统版本和内核版本 # 查看系统版本 testubuntu:~$ sudo lsb_release -a Rel…

【Linux应用】开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)

【Linux应用】开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例) 参考: ZERO 3 | Radxa Docs 大部分的Linux开发板等设备都大同小异 如树莓派、香橙派、STM32MP135的Linux开发板等 …

Redis使用总结

NoSQL 1.1为什么要用NoSQL 面对现在用户数据的急剧上升,我们需要对这些用户数据进行挖掘,传统的关系型数据库已经不适合这些 应用了.Nosql 的发展可以很了的处理这些大的数据. 1.2什么是NoSQL Not Only Sql->NoSQL(不仅仅是SQL) 非关系型数据库.随…

Unity ML-Agents + VScode 环境搭建 Windows

安装Unity 先去官网下载Unity Hub,然后安装在D盘就可以了,你需要手机上安装一个Unity Connect进行账号注册。 详细的注册可以参考: https://blog.csdn.net/Dugege007/article/details/128472571 注册好了以后登入电脑端的Unity Hub&#x…