Java 中令人驚訝的整數裝箱行為
在 Java 中,Integer 物件是原始 int 值的包裝器。將 int 裝箱為 Integer 時,通常會期望 == 運算子來比較物件的值。但是,在某些情況下,== 運算子會比較物件的參考。這種行為可能會導致令人驚訝的結果。
考慮以下程式碼:
public class Scratch { public static void main(String[] args) { Integer a = 1000, b = 1000; System.out.println(a == b); Integer c = 100, d = 100; System.out.println(c == d); } }
執行時,此程式碼會列印:
false true
第一個輸出符合預期: == 比較兩個不同Integer物件的引用。然而,第二個輸出卻令人驚訝。為什麼當 c 和 d 具有相同值時 == 回傳 true?
答案就在 Java 語言規格 (JLS) 中。根據JLS 第5.1.7 節:
如果裝箱的值p 為true、false、一個位元組、u0000 到u007f 範圍內的char,或-128 到127 之間的int 或短數字,然後令r1 和r2 為p 的任兩次裝箱轉換的結果。情況始終是 r1 == r2。
這表示從指定範圍內的原始值建立的 Integer 物件保證具有相同的參考。在我們的例子中,c 和 d 都是從相同的 int 值 100 建立的,該值在 -128 到 127 的範圍內。因此,它們具有相同的引用,並且 == 運算子傳回 true。
雖然第二行輸出的行為得到保證,但 JLS 建議第一行輸出的行為沒有保證。理論上,Java 實作可以快取常見值的 Integer 物件以提高效能,但 JLS 不需要這種行為。因此,不同的 Java 實作可能會以不同的方式處理這種情況。
以上是為什麼 Java 的 == 運算子有時會比較整數物件值,有時比較引用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!