聽到這個問題的一瞬間,我的第一反應是:「口誤吧?127和128肯定不一樣啊~」,哈哈,你的呢?
其實這是一道大廠經典面試題,它觸及了 Java 中 Integer 物件的建立和緩存機制的一個微妙之處。
一、new Integer("127")
總是在堆記憶體中建立一個新的 Integer 物件。
值為 127。
不使用整數緩存池。
二、Integer.valueOf("128")
建立一個新的 Integer 物件,值為 128。
不使用整數緩存池,因為 128 超出了預設緩存範圍。
三、主要區別
1、物件建立
兩種方式在這個例子中都會建立新物件。
2、緩存使用
new Integer("127") 不使用緩存。
Integer.valueOf("128") 也不使用緩存,但原因不同(超出範圍)。
3、效能和記憶體:
在這個特定例子中,兩者的效能和記憶體使用基本相同。
4、值的考慮:
127 在緩存範圍內,但 new 關鍵字繞過了緩存。
128 超出緩存範圍,所以 valueOf 方法會建立新物件。
四、對比範例
Integer a = new Integer("127");
Integer b = new Integer("127");
System.out.println(a == b); // false
Integer c = Integer.valueOf("127");
Integer d = Integer.valueOf("127");
System.out.println(c == d); // true
Integer e = Integer.valueOf("128");
Integer f = Integer.valueOf("128");
System.out.println(e == f); // false
五、為什麽說Integer.valueOf("128") 也不使用緩存,是因為超出了範圍?
1、Integer 緩存是什麽?
Java 的 Integer 類維護了一個內部緩存,用於儲存經常使用的整數值。這個緩存就像一個預先準備好的數位集合。
預設情況下,這個緩存包含了 -128 到 127 之間的所有整數。
這個範圍是經過 Java 開發者仔細考慮後選定的,因為這個範圍內的數位在日常編程中使用頻率最高。
2、為什麽是 -128 到 127?
字節範圍: 這個範圍恰好對應一個字節(byte)可以表示的整數範圍。
常用數位: 大多數日常計算和迴圈中使用的小整數都在這個範圍內。
記憶體權衡: 緩存範圍不能太大,否則會占用過多記憶體。
3、為什麽 128 不在緩存中?
128 剛好超出了這個預定義的範圍。
當你呼叫 Integer.valueOf("128") 時,Java 會檢查這個數位是否在緩存範圍內。
發現 128 超出範圍後,Java 就會建立一個新的 Integer 物件,而不是使用緩存。
4、程式碼範例
Integer a = Integer.valueOf("127"); // 使用緩存
Integer b = Integer.valueOf("127"); // 使用緩存
System.out.println(a == b); // 輸出 true,因為是同一個緩存物件
Integer c = Integer.valueOf("128"); // 不使用緩存,建立新物件
Integer d = Integer.valueOf("128"); // 不使用緩存,再次建立新物件
System.out.println(c == d); // 輸出 false,因為是兩個不同的物件
5、可以改變緩存範圍嗎?
是的,可以透過 JVM 參數 -XX:AutoBoxCacheMax=
但是,下限 -128 是固定的,不能改變。
6、Integer物件比較
不要依賴於緩存機制來比較整數物件。
始終使用 .equals() 方法來比較 Integer 物件的值。
六 、結論
雖然在給定的例子中("127" 和 "128"),兩種方法都會建立新物件,但它們的行為原因不同:
new Integer("127") 總是建立新物件,無論值是多少。
Integer.valueOf("128") 建立新物件是因為 128 超出了緩存範圍。
在實際套用中,除非特別需要新物件,否則推薦使用 Integer.valueOf() 或自動裝箱,以便在可能的情況下利用緩存最佳化。
雖然了解這些細節很重要,但在日常編程中,我們應該專註於編寫清晰、正確的程式碼,而不是過度依賴於這些底層最佳化。正確使用 .equals() 進行值比較,以及優先使用 valueOf() 或自動裝箱,通常就足以編寫高效且可靠的程式碼。
·················END·················
用官方一半價格的錢,用跟官方 ChatGPT4.0 一模一樣功能的工具。
國內直接使用ChatGPT4o:
谷歌瀏覽器直接使用:https://www.nezhasoft.cn
無需魔法,同時支持手機、電腦
個人獨享
ChatGPT4o mini永久免費
支持Copilot、DALLE AI繪畫、上傳檔等
長按辨識下方二維碼,備註ai,發給你
回復gpt,獲取ChatGPT4o直接使用地址
點選閱讀原文,國內直接使用ChatGpt4o