問題:127處Java整數常數池行為的分歧
簡介:
The整數常數池是Java中的一種機制,可以優化常見整數值的快取以提高效能。然而,該池的行為在 127 時出現了變化,引起了開發人員的困惑。
理解行為:
對於從 -128 到 127 的整數,Java 保證引用相同常數的變數具有相同的引用。
Integer i1 = 127; Integer i2 = 127; System.out.println(i1 == i2); // True
這是因為這些值被緩存在常數池中。
分歧在128處:
但是當整數值超過127、行為改變。
Integer i1 = 128; Integer i2 = 128; System.out.println(i1 == i2); // False
這是由於實作最佳化所致。雖然 JLS 保證快取最多 127 個值,但超出該範圍,實作可能會選擇以不同方式快取值,甚至根本不快取值。
其他注意事項:
甚至在保證範圍(-128 到 127)內,快取行為並不總是可靠。例如,使用 new Integer() 可以繞過常數池並建立新的參考。
Integer i1 = new Integer(127); Integer i2 = new Integer(127); System.out.println(i1 == i2); // False
結論:
整數常數池在127 處的行為源自於實現最佳化與JLS 定義的保證範圍。開發人員應該意識到這種行為變化,以避免意外結果。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3