這道經典的 Java 面試題考察的是 Integer 物件建立方式對比較結果的影響。程式碼分別使用 new Integer(num) 和 Integer.valueOf(num) 建立兩個物件,並透過 == 比較參考位址。
Integer.valueOf() 方法內部會對 -128 到 127 之間的整數進行快取。當數值落在這個範圍時,會直接返回快取池中已存在的物件參考;超出範圍則會建立新物件。而 new Integer() 每次都會在堆記憶體中分配新的物件空間。
當 num = 127 時:
new產生的對象:false valueOf產生的對象:true
new 建立兩個不同物件,參考不同,故為 false。valueOf 因 127 在快取範圍內,返回同一個快取物件,參考相同,故為 true。
當 num = 128 時:
new產生的對象:false valueOf產生的對象:false
128 超出快取範圍,valueOf 也會建立新物件,因此兩次呼叫返回不同參考,結果同樣為 false。
Integer.valueOf() 或自動裝箱 Integer n = 127;,效能較佳且記憶體友善。Integer 數值時,務必使用 .equals() 而非 ==,避免快取範圍邊界導致的邏輯錯誤。-XX:AutoBoxCacheMax 調整。這道題目生動展示了 Java 基礎型別包裝類的記憶體管理細節,是面試與日常開發中必須掌握的核心知識點。