Java基本數據類型緩存池解析-源碼剖析

拋出問題:new Integer(18) 與 Integer.valueOf(18)?的區別是什么?

  • new Integer(18)?每次都會新建一個對象;
  • Integer.valueOf(18)?會使?用緩存池中的對象,多次調用只會取同?一個對象的引用
Integer x = new Integer(18);
Integer y = new Integer(18);
System.out.println(x == y);Integer z = Integer.valueOf(18);
Integer k = Integer.valueOf(18);
System.out.println(z == k);Integer m = Integer.valueOf(300);
Integer p = Integer.valueOf(300);
System.out.println(m == p);
來看一下輸出的結果吧

除了Float和Double之外,其他的六個包裝器類(Byte、Short、Integer、Long、Character、Boolean)都有常量緩存池。

為什么那兩個沒有呢? 很好思考,緩存這一思想,簡單理解,是把常用的準備好。

首先,Float、Double。都是不可窮舉,就算緩存也不知道緩存1.0、還是1.1等等。但是Boolean,僅僅只有true&false,還有這些整數類都一樣(也不是全緩存,而是都緩存了255)。

  • Byte:-128~127,也就是所有的 byte 值
  • Short:-128~127
  • Long:-128~127
  • Character:\u0000 - \u007F
  • Boolean:true 和 false
  • Integer:-128~127

為了知道為什么,來跟隨筆者閱讀valueof的源碼看看吧(bushi~,還是先看下面的注釋吧)。

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

貼出注釋:

翻譯: 返回一個Integer示例,表示指定的int 值。如果不需要一個新的Integer實例,則通常應優先使用此方法,而不是構造函數Integer(int),因為此方法可能通過緩存頻繁請求的值來產生更好的空間和時間性能。此方法將始終緩存-128到127(包括兩端)范圍內的值,

參數: i 一個 int值

返回值:一個表示Integer的實例 i

自1.5起

從這里發現,我們還需要看看IntegerCache這個靜態內部類的源碼:

private static class IntegerCache {static final int low = -128;static final int high;static final Integer[] cache;static Integer[] archivedCache;static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {h = Math.max(parseInt(integerCacheHighPropValue), 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(h, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;// Load IntegerCache.archivedCache from archive, if possibleCDS.initializeFromArchive(IntegerCache.class);int size = (high - low) + 1;// Use the archived cache if it exists and is large enoughif (archivedCache == null || size > archivedCache.length) {Integer[] c = new Integer[size];int j = low;for(int i = 0; i < c.length; i++) {c[i] = new Integer(j++);}archivedCache = c;}cache = archivedCache;// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}

同樣,先來看看注釋:

翻譯:

緩存支持JLS要求的自動裝箱的對象標識語義,適用于-128和127之間的值(包含)。緩存在首次使用時初始化。緩存的大小可以通過-XX:AutoBoxCacheMax=<size> 選項來控制。在VM初始化期間,java.lang.Integer.IntegerCache.high屬性可以設置并保存在jdk.internal.misc的私有系統屬性中。VM類。警告:緩存與CDS一起存檔,并在運行時從共享*存檔中重新加載。歸檔緩存(Integer[])和Integer對象位于封閉的歸檔堆區域中。更改實現時應小心,初始化后不應為緩存數組分配新的Integer對象。

說人話:就是通過Integer.valueOf()方法獲取整數對象時,會先檢查該整數是否存在IntegerCache中,如果在,則返回緩存中的對象,否則創建一個新的對象并緩存起來。

?assert IntegerCache.high >= 127;

這里這個assert,是一個關鍵字,寓意是斷言,為了方便表示程序,并不是發布程序的組成部分。

默認情況下,斷言是關閉的,可以在命令行允許java程序時候加入 -ea參數來打開斷言。

來看這個代碼:

public class Test {public static void main(String[] args) {int high = 126;assert high >= 127;}
}

在這里通過命令行,java -ea參數可以看到報錯了。這里我們斷言high>=127.當不滿足時候,就會報錯。實際上不止Java有這種設計,C也有,感興趣的可以去了解。

在Java中,針對一些基本數據類型,Java會在程序啟動時候創建一些常用的對象并緩存在內存中,以提高程序的性能和節省內存開銷。這些常用對象緩存在一個固定的范圍內,超過這個范圍的值會被重新創建新的對象。

使用數據類型緩存池可以有效提高程序的性能和節省內存開銷,但需要注意的是,在特定業務下,緩存池可能帶來一些問題,比如,緩存池中的對象被不同的線程同時修改,導致數據錯誤等問題。因此,實際開發中,需要根據具體的業務需求來決定是否需要使用數據類型緩存池。

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

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

相關文章

WORD壓縮兩個免費方法

日常辦公和學習中&#xff0c;Word文檔常常因為包含大量圖片、圖表或復雜格式而導致文件體積過大&#xff0c;帶來諸多不便&#xff0c;比如 郵件發送受限&#xff1a;許多郵箱附件限制在10-25MB&#xff0c;大文件無法直接發送 存儲空間占用&#xff1a;大量文檔占用硬盤或云…

羅技無線鼠標的配對方法

羅技鼠標的配對方法&#xff1a; 重新連接鼠標 請按照以下步驟將鼠標與 USB 接收器重新配對。 1.將USB接收器插入計算機。 2.將鼠標關閉電源。 3.按住并持續按住向右按鈕&#xff0c;直到操作結束。 4.切換鼠標電源。 5. 單擊一次左側按鈕。 6. 單擊一次中間按鈕。 7.全部松開&…

四、Hadoop 2.X vs 3.X:特性、架構與性能全解析

Hadoop 2.X 與 Hadoop 3.X 深度對比&#xff1a;版本特性、架構與性能剖析 在大數據處理的浪潮中&#xff0c;Hadoop 憑借其分布式存儲與計算的強大能力&#xff0c;成為了業界的核心框架之一。隨著技術的不斷演進&#xff0c;Hadoop 也經歷了多個重要版本的迭代。其中&#x…

【React中useReducer鉤子詳解】

useReducer 是 React 中用于管理復雜狀態邏輯的 Hook&#xff0c;它通過 集中式狀態更新邏輯 替代 useState&#xff0c;尤其適合處理多值關聯狀態或依賴前序狀態更新的場景。以下是其核心要點&#xff1a; 1. 核心概念 Reducer 模式&#xff1a;靈感來自 JavaScript 的 Array…

【C++】C++函數指針詳解與實用技巧

C函數指針詳解與實用技巧 在C中&#xff0c;**函數指針&#xff08;Function Pointer&#xff09;**是一種強大而靈活的工具&#xff0c;常用于回調機制、策略模式、事件處理等場景。本文將從概念、語法、常見用法到實戰示例&#xff0c;帶你全面掌握C函數指針。 &#x1f9e0…

【計算機視覺】基于深度學習的實時情緒檢測系統:emotion-detection項目深度解析

基于深度學習的實時情緒檢測系統&#xff1a;emotion-detection項目深度解析 1. 項目概述2. 技術原理與模型架構2.1 核心算法1) 數據預處理流程2) 改進型MobileNetV2 2.2 系統架構 3. 實戰部署指南3.1 環境配置3.2 數據集準備3.3 模型訓練3.4 實時推理 4. 常見問題與解決方案4.…

IC ATE集成電路測試學習——電流測試的原理和方法

電流測試 我們可以通過電流來判斷芯片的工作狀態時&#xff0c;首先先了解下芯片的電流是如何產生的。 靜態電流 理論上&#xff0c;CMOS結構的芯片靜態時幾乎不耗電 CMOS基本結構&#xff1a;Pmos Nmos 串聯當邏輯電平穩定時&#xff1a; ? 要么Pmos導通&#xff0c;Nmo…

stm32week15

stm32學習 十一.中斷 2.NVIC Nested vectored interrupt controller&#xff0c;嵌套向量中斷控制器&#xff0c;屬于內核(M3/4/7) 中斷向量表&#xff1a;定義一塊固定的內存&#xff0c;以4字節對齊&#xff0c;存放各個中斷服務函數程序的首地址&#xff0c;中斷向量表定…

list類的詳細講解

【本節目標】 1. list的介紹及使用 2. list的深度剖析及模擬實現 3. list與vector的對比 1. list的介紹及使用 1.1 list的介紹 1. list 是可以在常數范圍內在任意位置進行插入和刪除的序列式容器&#xff0c;并且該容器可以前后雙向迭代。 2. list 的底層是雙向鏈表結構&a…

第十節:圖像處理基礎-圖像算術運算 (加法、減法、混合)

引言 在計算機視覺領域,圖像算術運算是最基礎卻至關重要的核心技術。無論是實現簡單的圖片合成、開發智能監控系統,還是構建復雜的醫學影像分析工具,加減運算和混合操作都扮演著關鍵角色。OpenCV作為最流行的計算機視覺庫,提供了完善的圖像處理函數集。本文將深入解析三種…

【React 的useState鉤子詳解】

React 的 useState 鉤子詳解 useState 是 React 中最基礎且最常用的 Hook 之一&#xff0c;它允許你在函數組件中添加和管理狀態。 基本語法 const [state, setState] useState(initialState);initialState: 狀態的初始值&#xff0c;可以是任何 JavaScript 數據類型state:…

vue 中的數據代理

在 Vue 中&#xff0c;數據代理&#xff08;Data Proxy&#xff09; 是 Vue 實現 MVVM 模式 的關鍵技術之一。Vue 使用數據代理讓你可以通過 this.message 訪問 data.message&#xff0c;而不需要寫 this.data.message —— 這大大簡化了模板和邏輯代碼。 我們來深入理解它的本…

基于Python的網絡電子書閱讀系統

標題:基于Python的網絡電子書閱讀系統 內容:1.摘要 隨著數字化閱讀的興起&#xff0c;網絡電子書閱讀需求日益增長。本研究旨在開發一個基于Python的網絡電子書閱讀系統&#xff0c;以滿足用戶便捷閱讀電子書的需求。采用Python的Flask框架搭建Web服務器&#xff0c;結合SQLit…

基于SpringBoot的抽獎系統測試報告

一、編寫目的 本報告為抽獎系統測試報告&#xff0c;本項目可用于團體抽獎活動&#xff0c;包括了用戶注冊&#xff0c;用戶登錄&#xff0c;修改獎項以及抽獎等功能。 二、項目背景 抽獎系統采用前后端分離的方法來實現&#xff0c;同時使用了數據庫來存儲相關的數據&…

Apache Flink 與 Flink CDC:概念、聯系、區別及版本演進解析

Apache Flink 與 Flink CDC:概念、聯系、區別及版本演進解析 在實時數據處理和流式計算領域,Apache Flink 已成為行業標桿。而 Flink CDC(Change Data Capture) 作為其生態中的重要組件,為數據庫的實時變更捕獲提供了強大的能力。 本文將從以下幾個方面進行深入講解: 什…

單片機-STM32部分:9、定時器

飛書文檔https://x509p6c8to.feishu.cn/wiki/A749wx8T0ioqfgkzZKlc9poknUf SMT32F1系列共有8個定時器&#xff1a; 基本定時器&#xff08;TIM6、TIM7&#xff09; 通用定時器&#xff08;TIM2、TIM3、TIM4、TIM5&#xff09; 高級定時器&#xff08;TIM1、TIM8&#xff09…

uniapp-商城-51-后臺 商家信息(logo處理)

前面對頁面基本進行了梳理和說明&#xff0c;特別是對驗證規則進行了闡述&#xff0c;并對自定義規則的兼容性進行了特別補充&#xff0c;應該說是干貨滿滿。不知道有沒有小伙伴已經消化了。 下面我們繼續前進&#xff0c;說說頁面上的logo上傳組件&#xff0c;主要就是uni-fil…

ideal創建Springboot項目(Maven,yml)

以下是使用 IntelliJ IDEA 創建基于 Maven 的 Spring Boot 項目并使用 YAML 配置文件的詳細步驟&#xff1a; 一、創建 Spring Boot 項目 啟動項目創建向導 打開 IntelliJ IDEA&#xff0c;點擊“File”->“New”->“Project”。 在彈出的“New Project”窗口中&#…

MATLAB中矩陣和數組的區別

文章目錄 前言環境配置1. 數據結構本質2. 運算規則&#xff08;1&#xff09;基本運算&#xff08;2&#xff09;特殊運算 3. 函數與操作4. 高維支持5. 創建方式 前言 在 MATLAB 中&#xff0c;矩陣&#xff08;Matrix&#xff09; 和 數組&#xff08;Array&#xff09; 的概…

iTwin 數據報表(只是簡單的原型不代表實現)

大概想法是 前端從schema和class中選中感興趣的property內容生成ecsql語句傳遞給后端后端解析ecsql并提供公開接口給各個分析工具&#xff0c;如excel&#xff0c;poewerBI等&#xff08;Odata或者直接選擇來自網站&#xff09;再由分析工具做進一步的處 還未想好的點 如何存…