1. 程式人生 > >Java包裝類與基本型別進行比較的坑

Java包裝類與基本型別進行比較的坑

今天使用Java的包裝類和基本型別做比較的時候發現了包裝本身存在的坑,參考的JDK版本是1.8.0_121,下面是例子程式碼:

Short packShort=1;
short baseShort=1;
Integer packInt=1;
int baseInt=1;
//用Short的equals()方法與short進行比較
System.out.println(packShort.equals(baseShort));
//用==比較Short和short
System.out.println(packShort==baseShort);
//用Short的equals()方法與int進行比較
System.out.println(packShort.equals(baseInt));
//用Short的equals()方法與Integer進行比較
System.out.println(packShort.equals(packInt));
//用==比較Short和int
System.out.println(packShort==baseInt);
//用==比較Short和Integer,不能進行比較,型別不同
//System.out.println(packShort==packInt);

程式碼的執行結果如下:

true
true
false
false
true

先不分析執行結果,大家可以先看一下Short中的equals()原始碼:

public boolean equals(Object obj) {
    if (obj instanceof Short) {
        return value == ((Short)obj).shortValue();
    }
    return false;
}

在Integer中equals()程式碼類似,有興趣可以自行去看一下,這裡就不重複了。以下是結果分析:

  1. 用Short的equals()方法與short進行比較的時候,short型別會被判斷為是Short型別的例項,然後兩個物件都會被轉化為基本型別用==進行比較,所以結果為true。
  2. 用==比較Short和short的時候,Short型別物件被拆箱(轉為short基本型別),所以結果為true。
  3. 用Short的equals()方法與int進行比較的時候,由於型別判斷那裡就已經為false了,直接返回false。
  4. 用Short的equals()方法與Integer進行比較的時候,與用Short的equals()方法與int進行比較的時候同樣的原因,返回結果為false。
  5. 用==比較Short和int的時候,Short首先是進行了拆箱(轉為short基本型別),然後是自動提升型別(轉為int),之後才進行比較,所以結果為true。