Java 包裝類型的緩存機制了解嗎?

在 Java 中,基本數據類型有各自的包裝類型。這些包裝類型在某些情況下會使用緩存機制來提高性能。本文將詳細探討這些緩存機制的實現原理及其實際應用。

什么是包裝類型的緩存機制?

Java 的包裝類型緩存機制是指在某些特定范圍內,包裝類型對象會被緩存以減少內存開銷和提高性能。對于經常使用的數值,Java 選擇了預先創建并緩存這些對象,當需要這些數值時,直接返回緩存中的對象,而不是每次都新建一個對象。

哪些包裝類型使用了緩存機制?

  1. 整型包裝類Byte,?Short,?Integer,?Long

    • 緩存范圍:-128 到 127
  2. 字符型包裝類Character

    • 緩存范圍:0 到 127
  3. 布爾型包裝類Boolean

    • 緩存對象:TRUE,?FALSE

需要注意的是,兩種浮點數類型的包裝類?Float?和?Double?沒有實現緩存機制。

整型緩存機制源碼分析

以?Integer?為例:

java

public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {int h = 127;high = h;cache = new Integer[(high - low) + 1];int j = low;for (int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}
}

Character?緩存機制源碼分析

java

public static Character valueOf(char c) {if (c <= 127) { // must cachereturn CharacterCache.cache[(int)c];}return new Character(c);
}private static class CharacterCache {private CharacterCache(){}static final Character cache[] = new Character[127 + 1];static {for (int i = 0; i < cache.length; i++)cache[i] = new Character((char)i);}
}

Boolean?緩存機制源碼分析

java

public static Boolean valueOf(boolean b) {return (b ? TRUE : FALSE);
}

浮點數類型沒有緩存機制的原因

浮點數類型?Float?和?Double?沒有實現緩存機制,主要是因為浮點數的表示范圍非常大,幾乎不可能像整型那樣劃定一個合理的緩存范圍,同時浮點數的使用場景多樣,緩存效果并不明顯。

緩存機制的實際應用

使用緩存機制后,程序在頻繁使用小范圍數值時可以節省內存和提高性能。以下是一些例子:

java

Integer i1 = 33;
Integer i2 = 33;
System.out.println(i1 == i2); // 輸出 trueFloat f1 = 333f;
Float f2 = 333f;
System.out.println(f1 == f2); // 輸出 falseDouble d1 = 1.2;
Double d2 = 1.2;
System.out.println(d1 == d2); // 輸出 false

典型面試題分析

考慮以下代碼的輸出結果:

java

Integer i1 = 40;
Integer i2 = new Integer(40);
System.out.println(i1 == i2);

Integer i1 = 40;?會發生自動裝箱,等價于?Integer i1 = Integer.valueOf(40);。因此,i1?使用的是緩存中的對象。而?Integer i2 = new Integer(40);?則是創建了一個新的對象。因此,i1?和?i2?不是同一個對象,結果為?false

關鍵點總結

  1. 緩存范圍:整型包裝類和字符型包裝類在特定范圍內使用緩存。
  2. 比較方式:對于包裝類型,特別是整型包裝類,建議使用?equals?方法進行值比較。
  3. 浮點數類型Float?和?Double?沒有緩存機制。

實戰案例

假設有一個系統需要頻繁使用 -128 到 127 范

圍的整數,可以通過緩存機制來優化性能。我們通過一個示例代碼展示如何利用緩存機制提升性能:

java

public class IntegerCacheDemo {public static void main(String[] args) {int iterations = 1000000;// 使用緩存機制long startTime = System.nanoTime();for (int i = 0; i < iterations; i++) {Integer a = 127; // 使用緩存Integer b = 127; // 使用緩存if (a != b) {throw new AssertionError("Cached Integer values not equal!");}}long endTime = System.nanoTime();System.out.println("With cache: " + (endTime - startTime) + " ns");// 不使用緩存機制startTime = System.nanoTime();for (int i = 0; i < iterations; i++) {Integer a = new Integer(127); // 不使用緩存Integer b = new Integer(127); // 不使用緩存if (a == b) {throw new AssertionError("New Integer values should not be equal!");}}endTime = System.nanoTime();System.out.println("Without cache: " + (endTime - startTime) + " ns");}
}

在這段代碼中,我們通過循環創建大量的?Integer?對象,分別測試使用緩存和不使用緩存的性能差異。可以看到,使用緩存時性能更優,因為不需要頻繁創建新的對象。

性能對比結果

通過上述代碼的運行結果,我們可以明顯看到使用緩存機制的性能優勢。以下是一個示例輸出:

txt

With cache: 30000000 ns
Without cache: 60000000 ns

從結果中可以看出,使用緩存機制比不使用緩存機制快了近一倍。這充分說明了緩存機制在頻繁使用小范圍數值時的性能優勢。

緩存機制的實際應用場景

緩存機制在實際開發中有很多應用場景,以下是幾個典型的例子:

  1. 數據處理和統計計算:在大數據處理和統計計算中,經常會涉及大量的小數值計算,如統計頻次、計數等。這些操作中可以充分利用緩存機制來提升性能。

  2. 系統配置和常量:在系統配置和常量處理中,很多配置值和常量都是在小范圍內的整數或字符,這時可以利用緩存機制減少內存開銷。

  3. 常見算法和數據結構:在實現常見算法和數據結構(如哈希表、堆等)時,經常需要頻繁使用整數值,利用緩存機制可以提升這些數據結構的性能。

進階思考

在深入理解了包裝類型的緩存機制后,可以進一步思考以下幾個問題:

  1. 為什么緩存范圍是 -128 到 127?:這是因為在 Java 語言規范中,這個范圍的整數是最常用的。選擇這個范圍既能覆蓋大多數常見用例,又不會因為緩存過大而占用過多內存。

  2. 如何自定義緩存范圍?:雖然默認緩存范圍是 -128 到 127,但我們可以通過設置 JVM 參數?-XX:AutoBoxCacheMax=<size>?來自定義緩存的最大值。例如,-XX:AutoBoxCacheMax=1000?會將緩存范圍擴展到 -128 到 1000。

  3. 緩存機制的線程安全問題:Java 的緩存機制是線程安全的,因為這些緩存對象是不可變的(即?final?和?static?修飾),因此在多線程環境下使用也是安全的。

總結

Java 包裝類型的緩存機制是一個重要的性能優化手段,特別是在頻繁使用小范圍數值的場景下。通過理解和利用這種機制,可以顯著提升系統的性能和減少內存開銷。

如果有更多疑問或需要深入探討的內容,歡迎在評論區留言,我們將一同交流探討。

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

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

相關文章

【知識碎片】2024_05_14

本篇記錄了兩道關于位運算的選擇題&#xff0c;和一道有點思維的代碼題。 C語言碎片知識 求函數返回值&#xff0c;傳入 -1 &#xff0c;則在64位機器上函數返回&#xff08; &#xff09; int func(int x) {int count 0;while (x){count;x x&(x - 1);//與運算} return c…

24/05/14總結

簽到2&#xff1a; 簽到界面上有時間顯示&#xff0c;簽到碼輸入框&#xff0c;開始簽到&#xff0c;當倒計時結束&#xff0c;老師端和學生端都會顯示簽到結果&#xff0c;所以簽到結果需要建表&#xff1a;&#xff08;簽到了的學生和未簽到的學生&#xff0c; 這次簽到的時間…

詳述進程的地址空間

進程的地址空間 合法的地址 (可讀或可寫) 代碼 (main, %rip 會從此處取出待執行的指令)&#xff0c;只讀數據 (static int x)&#xff0c;讀寫堆棧 (int y)&#xff0c;讀寫運行時分配的內存 (???)&#xff0c;讀寫動態鏈接庫 (???) 非法的地址 NULL&#xff0c;導致 se…

藍橋杯第2357題——限高桿(多層圖+dijkstra)

問題描述 某市有 &#x1d45b; 個路口, 有 &#x1d45a; 段道路連接這些路口, 組成了該市的公路系統。其 中一段道路兩端一定連接兩個不同的路口。道路中間不會穿過路口。 由于各種原因, 在一部分道路的中間設置了一些限高桿, 有限高桿的路段 貨車無法通過。 在該市有兩個…

【微命令】git config如何配置全局的用戶和郵箱?(--global user.name、user.email;git config --help)

雖然經常用&#xff0c;也經常忘記&#xff0c;特此記錄。 命令 git config --global user.name "myname" git config --global user.email test163.com另外一種方式 help git config --help |grep email | grep name直接help查看

Git系列:git log 掌握版本控制的精髓

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:「stormsha的主頁」…

【科普】ChatGPT-4o 是什么?和之前的ChatGPT4.0有什么區別,各有什么優劣勢

文章目錄 前言一、ChatGPT-4o 是什么&#xff1f;**主要特點和改進**&#xff1a; 二、ChatGPT-4o 和之前的ChatGPT4.0有什么區別&#xff0c;各有什么優劣勢區別優勢和劣勢ChatGPT-4.0ChatGPT-4o 前言 5月13日&#xff0c;ChatGPT-4o發布&#xff0c;是人工智能的進一步發展&…

【leetcode面試經典150題】-27. 移除元素

88.合并兩個有序數組 1 題目介紹1 個人解題思路1.1 解題代碼1.2 思路解析 2、分析官方題解2.1 單側雙指針2.2 雙側雙指針 1 題目介紹 給你一個數組 nums 和一個值 val&#xff0c;你需要 原地 移除所有數值等于 val 的元素&#xff0c;并返回移除后數組的新長度。 不要使用額外…

Echarts結課之小楊總結版

Echarts結課之小楊總結版 前言基礎回顧框架sale框架代碼&#xff1a; user框架基礎代碼&#xff1a; inventory框架基礎代碼&#xff1a; total框架基礎代碼&#xff1a; 基礎設置1.標題(Title)2.圖例(Legend)實現 3.工具提示(Tooltip)實現 4.X軸(X Axis) 和 Y軸(Y Axis)5.數據…

「Qt Widget中文示例指南」如何實現一個快捷編輯器(二)

Qt 是目前最先進、最完整的跨平臺C開發工具。它不僅完全實現了一次編寫&#xff0c;所有平臺無差別運行&#xff0c;更提供了幾乎所有開發過程中需要用到的工具。如今&#xff0c;Qt已被運用于超過70個行業、數千家企業&#xff0c;支持數百萬設備及應用。 快捷編輯器示例展示…

Leetcode 第 129 場雙周賽題解

Leetcode 第 129 場雙周賽題解 Leetcode 第 129 場雙周賽題解題目1&#xff1a;3127. 構造相同顏色的正方形思路代碼復雜度分析 題目2&#xff1a;3128. 直角三角形思路代碼復雜度分析 題目3&#xff1a;3129. 找出所有穩定的二進制數組 I思路代碼復雜度分析 題目4&#xff1a;…

電子郵箱是什么?怎么申請一個電子郵箱?

電子郵箱是我們溝通的工具&#xff0c;細分為免費版電子郵箱和付費版電子郵箱。怎么申請一個屬于自己的電子郵箱&#xff1f;今天小編就分享一下電子郵箱注冊教程&#xff0c;手把手教您注冊一個電子郵箱。 一、電子郵箱的定義 電子郵箱&#xff0c;簡稱郵箱&#xff0c;是一…

BGP路由優選

1.BGP路由優選規則 上述規則依序排列&#xff0c;BGP進行路由優選時&#xff0c;從第一條規則開始執行&#xff0c;如果根據第一條規則無法作出判斷&#xff0c;例如路由的Preferred-Value屬性值相同&#xff0c;則繼續執行下一條規則&#xff0c;如果根據當前的規則&#xff0…

如何快速打開多個網頁?

在平常的工作當中&#xff0c; 如果每天都需固定打開幾個網站&#xff0c;可以通過創建一個批處理&#xff0c;一鍵打開需要的所有網站。 使用方法&#xff1a; 在桌面新建一個txt文本&#xff0c;按照以下格式輸入代碼&#xff0c;并將需要打開網站的地址輸入進去。 ? ec…

JavaScript異步編程——11-異常處理方案【萬字長文,感謝支持】

異常處理方案 在JS開發中&#xff0c;處理異常包括兩步&#xff1a;先拋出異常&#xff0c;然后捕獲異常。 為什么要做異常處理 異常處理非常重要&#xff0c;至少有以下幾個原因&#xff1a; 防止程序報錯甚至停止運行&#xff1a;當代碼執行過程中發生錯誤或異常時&#x…

虛擬化技術 在vCenter Server創建數中心、添加主機

一、實驗內容 1.安裝Flash 2.在vCenter Server創建數中心、添加主機 二、實驗主要儀器設備及器材 1.安裝有64位Windows操作系統的臺式電腦或筆記本電腦&#xff0c;建議4C8G或以上配置 2.在Windows Server 2008 R2已安裝vCenter Server 3.Adobe Flash Player 12.0.0.70.e…

算法-卡爾曼濾波之卡爾曼濾波的第一個方程:狀態更新方程

通過一個例子來引出卡爾曼濾波的狀態更新方程&#xff1b; 這里系統狀態是金條的重量&#xff1b; 為了估計系統的狀態&#xff0c;我們可以多次測量金條的重量&#xff0c;然后求平均值&#xff1b; 其中估計值是所有測量值的平均值&#xff1b; 由于我們使用的是靜態模型&am…

第十六節:圖 (20節)

一 圖的概念 1&#xff09;由點的集合和邊的集合構成 2&#xff09;雖然存在有向圖和無向圖的概念&#xff0c;但實際上都可以用有向圖來表達 3&#xff09;邊上可能帶有權值 二 圖結構的表達 1&#xff09;鄰接表法 2&#xff09;鄰接矩陣法 3&#xff09;除此之外還有其他眾多…

Halcon與深度學習框架結合進行圖像分析

Halcon 是一款強大的機器視覺軟件&#xff0c;而深度學習框架如 TensorFlow 或 PyTorch 在圖像識別和分類任務中表現出色。結合兩者的優勢&#xff0c;可以實現復雜的圖像分析任務。Halcon 負責圖像預處理和特征提取&#xff0c;而深度學習框架則利用這些特征進行高級分析和識別…

【完整過程】Windows下記錄PadleOCR訓練自己的ocr模型

一、前期準備 1、代碼 參考的博主使用的是2.6版本的 博主的paddleocr代碼 下面這個是官方的&#xff0c;可能已經更新了&#xff08;我用的是官網當前最新版&#xff09; paddleocr的源代碼 注意&#xff1a;最好把上面兩個代碼都下載下來&#xff0c;后面都會用到 參考博…