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