首頁 >Java >java教程 >為什麼 Java 的整數裝箱對於「Integer == Integer」比較產生不同的結果?

為什麼 Java 的整數裝箱對於「Integer == Integer」比較產生不同的結果?

Susan Sarandon
Susan Sarandon原創
2024-12-24 08:39:14714瀏覽

Why Does Java's Integer Boxing Produce Different Results for `Integer == Integer` Comparisons?

Weird Java Integer Boxing

Java's integer boxing機制會讓你感到一絲困惑,尤其是當比較引用相等性時。

問題

考慮以下程式碼片段:

public class Scratch {
    public static void main(String[] args) {
        Integer a = 1000, b = 1000;
        System.out.println(a == b); // false

        Integer c = 100, d = 100;
        System.out.println(c == d); // true
    }
}

運作後會產生:

false
true

第一行結果是預期的,因為a 和b 是不同的物件。但第二行結果是為什麼?

回答

第二行的 true 結果是由語言規範保證的。根據第5.1.7 節:

如果要裝箱的值p 為true、false、範圍在u0000 到u007f 的byte 或char,或者介於-128 和127 之間的int 或short,那麼任何兩次對p 的裝箱轉換的結果r1 和r2 總是相等的。

儘管第二行輸出是保證的,但第一行卻不是(見下面引用的最後一段):

理想情況下,給定一個原始值p 的裝箱總是會產生相同的參考。在實踐中,使用現有的實現技術可能無法做到這一點。上述規則是務實的折衷方案。上面的最後一條條款要求對某些常見值始終裝箱成無法區分的物件。實作可以對其進行緩存,無論是以延遲方式還是立即方式。

對於其他值,這個表述不允許程式設計師對裝箱值的標識做出任何假設。這允許(但不強制)共享其中的一些或所有引用。

這確保了在大多數常見情況下,行為將是期望的行為,而不會對性能造成不必要的損失,特別是在小型設備上。記憶體限制較少的實作可以快取所有字元和短整型,以及範圍在 -32K 到 32K 之間的整數和長整型。

以上是為什麼 Java 的整數裝箱對於「Integer == Integer」比較產生不同的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn