Java包裝類與基本型別進行比較的坑
阿新 • • 發佈:2019-01-26
今天使用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()程式碼類似,有興趣可以自行去看一下,這裡就不重複了。以下是結果分析:
- 用Short的equals()方法與short進行比較的時候,short型別會被判斷為是Short型別的例項,然後兩個物件都會被轉化為基本型別用==進行比較,所以結果為true。
- 用==比較Short和short的時候,Short型別物件被拆箱(轉為short基本型別),所以結果為true。
- 用Short的equals()方法與int進行比較的時候,由於型別判斷那裡就已經為false了,直接返回false。
- 用Short的equals()方法與Integer進行比較的時候,與用Short的equals()方法與int進行比較的時候同樣的原因,返回結果為false。
- 用==比較Short和int的時候,Short首先是進行了拆箱(轉為short基本型別),然後是自動提升型別(轉為int),之後才進行比較,所以結果為true。