Integer的==與equals比較——開發中遇到的大坑

代碼

先來看一個例子:

public class MyTest {
   public static void main(String[] args) throws IOException {
      Integer v1 = 12;
      Integer v2 = 12;
      System.out.println(v1 == v2);

      Integer v3 = 500;
      Integer v4 = 500;
      System.out.println(v3 == v4);
   }
}

都是對兩個數值進行比較,得到的結果會是一樣的嗎?看下打印的結果:

true
false

Process finished with exit code 0

結果有點出乎意外,都是比較兩個值,得到的結果確實不一樣的。

原因分析

這裏引用阿里巴巴規範手冊的一段說明

【強制】所有的相同類型的包裝類對象之間值的比較,全部使用 equals 方法比較。
說明:對於 Integer var=?在-128 至 127 之間的賦值,Integer 對象是在 IntegerCache.cache產生,會複用已有對象,這個區間內的 Integer 值可以直接使用==進行判斷,但是這個區間之外的所有數據,都會在堆上產生,並不會複用已有對象,這是一個大坑,推薦使用 equals 方法進行判斷。

可見這個確實是一個大坑,所以手冊中強制使用equals進行判斷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章