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.pswp.cn/bicheng/78634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78634.shtml
英文地址,請注明出處:http://en.pswp.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…