當前位置: 妍妍網 > 碼農

美團面試題:new Integer("127")和Integer.valueOf("128")有什麽區別?

2024-08-21碼農


聽到這個問題的一瞬間,我的第一反應是:「口誤吧?127和128肯定不一樣啊~」,哈哈,你的呢?

其實這是一道大廠經典面試題,它觸及了 Java 中 Integer 物件的建立和緩存機制的一個微妙之處。

一、new Integer("127")

  1. 總是在堆記憶體中建立一個新的 Integer 物件。

  2. 值為 127。

  3. 不使用整數緩存池。

二、Integer.valueOf("128")

  1. 建立一個新的 Integer 物件,值為 128。

  2. 不使用整數緩存池,因為 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?

  1. 字節範圍: 這個範圍恰好對應一個字節(byte)可以表示的整數範圍。

  2. 常用數位: 大多數日常計算和迴圈中使用的小整數都在這個範圍內。

  3. 記憶體權衡: 緩存範圍不能太大,否則會占用過多記憶體。

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

  1. 無需魔法,同時支持手機、電腦

  2. 個人獨享

  3. ChatGPT4o mini永久免費

  4. 支持Copilot、DALLE AI繪畫、上傳檔等

長按辨識下方二維碼,備註ai,發給你

回復gpt,獲取ChatGPT4o直接使用地址

點選閱讀原文,國內直接使用ChatGpt4o