Integer 緩存機制

現象描述

Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true(引用相同,從緩存中取)Integer c = 200;
Integer d = 200;
System.out.println(c == b); // false(超出緩存范圍,new Integer(200))

原因分析

Integer從Java 5開始,引入了緩存機制,用于緩存一定范圍內的Integer對象。

  • 默認緩存范圍是-128~127
  • 這些值對應的Integer對象在JVM啟動時就被創建,并緩存在內存中

Integer緩存與JVM的關系

Integer中有一個靜態內部類

private static class IntegerCache {static final int high;static final Integer cache[];static {final int low = -128;// high value may be configured by propertyint h = 127;if (integerCacheHighPropValue != null) {// Use Long.decode here to avoid invoking methods that// require Integer's autoboxing cache to be initializedint i = Long.decode(integerCacheHighPropValue).intValue();i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - -low);}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}private IntegerCache() {}}

從JVM初始化的配置中獲取integerCacheHighPropValue,如果大于127,那么初始化的最大值就是integerCacheHighPropValue
cache數組的個數是hight-low+1
在cache中初始化從low到high的數字

public static Integer valueOf(int i) {if(i >= -128 && i <= IntegerCache.high)return IntegerCache.cache[i + 128];elsereturn new Integer(i);}

當調用Integer.valueOf的時候,如果i的范圍在-127~IntegerCache.high,就直接從緩存中取。因為是從緩存中直接獲取的,所以即使多次獲取,對象的內存地址是相同的。
但是如果i不在這個范圍內,那么回返回一個新的對象,這時即使i的數字相同,但多個對象的內存地址不同。用==來比較,結果會是false.

編碼

Integer a = 200;
Integer b = 200;
int c = 200;// ? 危險:結果依賴緩存
System.out.println(a == b); // false// ? 安全:比較值
System.out.println(a.equals(b)); // true// ? 安全高效
System.out.println(a == c); // true(拆箱比較)// ? 最安全(推薦)
System.out.println(Objects.equals(a, b)); // true
  • Integer VS Integer:必須用equals()Object.equals
  • Integer VS int:用==更安全、更高效
  • 為了避免null的問題,有限使用Objects.equals(a,b)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96006.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96006.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96006.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

生物化學Learning Track(II)——多肽+蛋白質一級結構

本筆記基于楊榮武教授第四版《生物化學》&#xff08;持續更新&#xff09;1. 多肽我們在上一節筆記里面介紹了什么是氨基酸&#xff0c;還有氨基酸的種類以及氨基酸基本的一些性質如等電點極性手性等等&#xff0c;這里我們開始介紹氨基酸結合的產物&#xff0c;因為氨基酸是脫…

Caffeine Weigher

Weigher 接口Weigher 是 Caffeine 緩存庫中一個非常重要的函數式接口&#xff0c;它用于計算緩存中每個條目&#xff08;entry&#xff09;的權重&#xff08;weight&#xff09;。這個權重值主要用于基于容量的驅逐策略&#xff0c;特別是當你希望緩存的總大小不是基于條目數量…

C/C++入門之搭建開發環境(VScode篇)

本文主要記錄 Visual Studio Code 中配置 C/C 的開發環境&#xff0c;包括項目設置、編譯選項和調試配置。VScode是編輯器&#xff0c;我們還需要安裝編譯器&#xff0c;才能實現編寫程序到生成可執行文件這一流程。關于編輯器&#xff0c;編譯器和IDE如果有些分不清&#xff0…

【營銷策略算法】關聯規則學習-購物籃分析

Apriori算法是關聯規則學習領域中最經典、最著名的算法之一&#xff0c;用于從大規模數據集中發現有價值的關聯規則。最典型的例子就是購物籃分析&#xff0c;通過分析顧客的購物籃&#xff0c;發現商品之間的關聯關系&#xff0c;從而制定營銷策略&#xff08;如“買尿布的顧客…

行為式驗證碼技術解析:滑塊拼圖、語序選詞與智能無感知

隨著傳統字符驗證碼逐漸被 OCR 與自動化腳本攻破&#xff0c;越來越多業務開始采用 行為式驗證碼 來區分真人與機器。這類驗證碼不僅依賴用戶的操作行為&#xff0c;還結合圖形干擾、環境信息和風控模型&#xff0c;既提升了安全性&#xff0c;也改善了用戶體驗。 常見的實現方…

基于多項式同態加密和秘密共享的JPEG可逆信息隱藏

學習題為《Reversible steganography in cipher domain for JPEG images using polynomial homomorphism》的論文隨著物聯網&#xff08;IoT&#xff09;設備的普及&#xff0c;大量敏感數據&#xff08;如指紋、身份信息&#xff09;需要在云端傳輸和存儲。傳統隱寫技術雖然能…

從 0 到 1 攻克訂單表分表分庫:億級流量下的數據庫架構實戰指南

引言&#xff1a; 本文總字數&#xff1a;約 8500 字建議閱讀時間&#xff1a;35 分鐘 當訂單表撐爆數據庫&#xff0c;我們該怎么辦&#xff1f; 想象一下&#xff0c;你負責的電商平臺在經歷了幾個雙十一后&#xff0c;訂單系統開始頻繁出現問題&#xff1a;數據庫查詢越來…

網絡編程(5)Modbus

【1】Modbus 1. 起源Modbus由Modicon公司于1979年開發&#xff0c;是全球第一個真正用于工業現場的總線協議在中國&#xff0c;Modbus 已經成為國家標準&#xff0c;并有專業的規范文檔&#xff0c;感興趣的可以去查閱相關的文件&#xff0c;詳情如下&#xff1a;標準編號為:GB…

WordPress性能優化全攻略:從插件實戰到系統級優化

一、性能診斷&#xff1a;定位瓶頸是優化第一步 在對 WordPress 進行性能優化前&#xff0c;精準定位性能瓶頸至關重要。這就好比醫生看病&#xff0c;只有先準確診斷&#xff0c;才能對癥下藥。下面將從核心性能指標檢測工具和服務器基礎性能排查兩個方面展開。 1.1 核心性能…

十、網絡與信息安全基礎知識

1 網絡概述 1.1 計算機網絡的概念 1.1.1 計算機網絡的發展 計算機網絡的發展經歷了四個主要階段&#xff1a; 具有通信功能的單機系統&#xff1a; 早期形式&#xff1a;一臺計算機連接多個終端。例子&#xff1a;20 世紀 50 年代的 SAGE 系統。 具有通信功能的多機系統&#x…

校園管理系統|基于SpringBoot和Vue的校園管理系統(源碼+數據庫+文檔)

項目介紹 : SpringbootMavenMybatis PlusVue Element UIMysql 開發的前后端分離的校園管理系統&#xff0c;項目分為管理端和用戶端和院校管理員端 項目演示: 基于SpringBoot和Vue的校園管理系統 運行環境: 最好是java jdk 1.8&#xff0c;我們在這個平臺上運行的。其他版本理…

新后端漏洞(上)- Weblogic SSRF漏洞

漏洞介紹&#xff1a;Weblogic中存在一個SSRF漏洞&#xff0c;利用該漏洞可以發送任意HTTP請求&#xff0c;進而攻擊內網中redis、fastcgi等脆弱組件。編譯及啟動測試環境docker-compose up -d訪問http://127.0.0.1:7001/uddiexplorer/&#xff0c;無需登錄即可查看uddiexplore…

Fiddler 實戰案例解析,開發者如何用抓包工具快速解決問題

在現代軟件開發中&#xff0c;網絡通信問題幾乎是最常見的 Bug 來源。無論是前端調用后端 API、移動端與服務端交互&#xff0c;還是第三方 SDK 請求&#xff0c;都會因為參數錯誤、環境差異、網絡條件不穩定而出現各種難以復現的問題。 在這些場景下&#xff0c;日志往往并不…

【佳易王藥品進銷存軟件實測】:操作簡單 + 全流程管理,醫藥臺賬管理好幫手#軟件教程全解析

前言&#xff1a; &#xff08;一&#xff09;試用版獲取方式 資源下載路徑&#xff1a;進入博主頭像主頁第一篇文章末尾&#xff0c;點擊卡片按鈕&#xff1b;或訪問左上角博客主頁&#xff0c;通過右側按鈕獲取詳細資料。 說明&#xff1a;下載文件為壓縮包&#xff0c;使用…

【設計模式】UML 基礎教程總結(軟件設計師考試重點)

【設計模式】UML 基礎教程總結(軟件設計師考試重點) 統一建模語言(Unified Modeling Language,UML),是一種標準化的面向對象建模語言,用于可視化、規范化和文檔化軟件系統設計。 參考資料:UML基礎教程資料(可用于軟件設計師考試)! (關注不迷路哈!!!) 文章目錄 【…

vite_react 插件 find_code 最終版本

vite_react 插件 find_code 最終版本當初在開發一個大型項目的時候&#xff0c;第一次接觸 vite 構建&#xff0c;由于系統功能很龐大&#xff0c;在問題排查上和模塊開發上比較耗時&#xff0c;然后就開始找解決方案&#xff0c;find-code 插件方案就這樣實現出來了&#xff0…

Python+DRVT 從外部調用 Revit:批量創建梁(2)

接著昨天的示例&#xff0c;繼續創建梁&#xff0c;這次展示以橢圓弧、Nurbs為軸線。 創建以橢圓弧為軸線的梁 橢圓弧曲線的創建&#xff1a; # 創建橢圓弧 def CreateEllipse(ctx : MyContext, z: float) -> DB.Curve:"""create a horizontal partial el…

Flutter × 鴻蒙系統:一文搞懂如何將你的 App 移植到 HarmonyOS!

摘要 Flutter 是一個高效的跨平臺框架&#xff0c;開發者可以使用同一套代碼快速部署到 Android、iOS 等主流平臺。隨著華為鴻蒙系統&#xff08;HarmonyOS&#xff09;的崛起&#xff0c;越來越多開發者希望能將已有的 Flutter 應用遷移到鴻蒙生態中運行。目前&#xff0c;通過…

QML Charts組件之主題與動畫

目錄前言相關系列ChartView 概述&#xff1a;主題與動畫示例一&#xff1a;主題設置&#xff08;ChartTheme.qml&#xff09;圖表與主題設置主題切換部分示例二&#xff1a;動畫設置&#xff08;ChartAnimation.qml&#xff09;圖表與動畫屬性部分分類軸與柱狀圖數據部分交互與…

【論文閱讀】Security of Language Models for Code: A Systematic Literature Review

Security of Language Models for Code: A Systematic Literature Review 該論文于2025年被CCF A類期刊TOSEM收錄&#xff0c;作者來自南京大學和南洋理工大學。 概述 代碼語言模型&#xff08;CodeLMs&#xff09;已成為代碼相關任務的強大工具&#xff0c;其性能優于傳統方法…