Java 中的整數相等:解開== 與equals 的困境
Java 在1.5 版本中引入了自動裝箱功能,可以方便地互換原語int 等類型及其對應的包裝類別(例如Integer)。然而,最近的一項觀察提出了關於使用 == 比較整數值的有效性的問題。
考慮以下程式碼:
Integer cdiCt = ...; Integer cdsCt = ...; ... if (cdiCt != null & cdiCt != cdsCt) mismatch = true;
令人驚訝的是,此程式碼有時會將不符合設定為即使 cdiCt 和 cdsCt 的值相等也是如此。在 Eclipse 中使用斷點發現兩個 Integer 值都等於 137,但條件式的計算結果為 false。
將條件更改為使用 equals() 代替:
if (cdiCt != null & cdiCt != null & !cdiCt.equals(cdsCt))
解決了問題。這就提出了一個問題:是否仍不建議使用 == 來比較兩個 Integer 值?
答案在於 Java 虛擬機器 (JVM) 對 Integer 值的快取。為了提高效能,JVM 快取 -128 到 127 之間的整數值。這意味著,當您使用 == 比較此範圍內的兩個整數值時,只有當它們引用相同的快取實例時,它們才會相等。
但是,如果值超出此範圍或未自動裝箱,它們將被視為不同的物件。這可能會導致意外的行為,如提供的範例所示。
因此,通常不建議依賴 == 來比較 Integer 值,特別是當它們可能超出快取範圍或精確度至關重要時。相反,使用 equals() 是確保可靠的相等比較的更安全方法。
以上是Java 整數比較:什麼時候應該使用 == 與 equals()?的詳細內容。更多資訊請關注PHP中文網其他相關文章!