為什麼整數常數池的行為在 127 之後有所不同
Java 中數字的常數池與字串的常數池不同。雖然只有編譯時常數保留在字串中,但任何裝箱操作都涉及整數包裝類型的池。
例如:
int x = 10; int y = x + 1; Integer z = y; // Not a compile-time constant Integer constant = 11; System.out.println(z == constant); // true
JLS 保證了小範圍的池值,實現可以選擇使用更大的範圍。
實際上,大多數實作使用Integer.valueOf 進行裝箱操作,導致以下行為:
Integer x = Integer.valueOf(100); Integer y = Integer.valueOf(100); System.out.println(x == y); // true
根據JLS 部分5.1.7:
-128 到127 之間的值在裝箱時將始終產生相同的參考。這是一個實際的折衷方案,可確保共同值始終無法區分。
但是,超出此範圍的值的行為會改變。出於效率原因,實作可能不會假設這些值的共用參考。
這可以確保在大多數情況下實現所需的行為,而不會顯著影響效能。記憶體限制的實作可以擴展快取以覆蓋更廣泛的值。
以上是為什麼 -128 到 127 範圍之外的整數值在 Java 常數池中表現不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!