首頁 > Java > java教程 > 為什麼 Java 的 == 運算子有時會比較整數物件值,有時比較引用?

為什麼 Java 的 == 運算子有時會比較整數物件值,有時比較引用?

Barbara Streisand
發布: 2024-12-24 02:28:14
原創
185 人瀏覽過

Why Does Java's `==` Operator Sometimes Compare Integer Object Values and Sometimes References?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板