基本類型和包裝類型之間有三個(gè)主要區(qū)別:
1、基本類型只有值,而兩個(gè)包裝類型可以具有相同的值和不同的同一性(值相同,但是==false)
2、基本類型只有功能完備的值,而每個(gè)包裝類型除了它對(duì)應(yīng)基本類型的所有功能值以外,還有個(gè)非功能值:null。
3、基本類型通常比包裝類型更節(jié)省時(shí)間和空間。
案例
(一)
package demo.one;
import java.util.Comparator;
/**
* 存在問題的實(shí)現(xiàn)方式
*
* @author TongWei.Chen
* @date 2017年3月21日21:08:11
*/
public class BadDemoOne {
//比較器,返回的數(shù)值到底是正數(shù)負(fù)數(shù)還是0,取決于他的第一個(gè)參數(shù)是小于等于還是大于第二個(gè)參數(shù)
static Comparator<Integer> naturalOrder = new Comparator<Integer>() {
public int compare(Integer first, Integer second) {
return first < second ? -1 : (first == second ? 0 : 1);
}
};
public static void main(String[] args) {
System.out.println(naturalOrder.compare(new Integer(66),
new Integer(66))); //1
}
}
從結(jié)果可以看出,輸出的居然是1,而不是0,原因在于first和second兩個(gè)參數(shù)表示同一個(gè)int值,但是是不同的Integer實(shí)例。所以這個(gè)比操作會(huì)返回false,對(duì)包裝類用==去比較幾乎總是錯(cuò)的,建議包裝類用equals去比較。
(二)解決上述問題
package demo.one;
import java.util.Comparator;
/**
* 解決BadDemoOne方式
*
* @author TongWei.Chen
* @date 2017年3月21日21:08:11
*/
public class GoodDemoOne {
//比較器,返回的數(shù)值到底是正數(shù)負(fù)數(shù)還是0,取決于他的第一個(gè)參數(shù)是小于等于還是大于第二個(gè)參數(shù)
static Comparator<Integer> naturalOrder = new Comparator<Integer>() {
public int compare(Integer first, Integer second) {
int f = first;
int s = second;
return f < s ? -1 : (f == s ? 0 : 1);
}
};
public static void main(String[] args) {
System.out.println(naturalOrder.compare(new Integer(66),
new Integer(66))); //0
}
}
強(qiáng)制在使用時(shí)讓他拆箱成基本類型,結(jié)果輸出正常,返回0。
(三)
package demo.two;
/**
* 存在NullPointerException
*
* @author TongWei.Chen
* @date 2017年3月21日21:26:28
*/
public class Unbelievable {
//包裝類型默認(rèn)null
static Integer i;
public static void main(String[] args) {
if(i == 42) {
System.out.println("我錯(cuò)了嘛?");
}
}
}
拋出NullPointerException,因?yàn)榘b類型默認(rèn)null
(四)解決上述問題
package demo.two;
/**
* 解決NullPointerException
*
* @author TongWei.Chen
* @date 2017年3月21日21:26:28
*/
public class Believable {
//int基本類型默認(rèn)0
static int i;
public static void main(String[] args) {
if(i == 42) {
System.out.println("我錯(cuò)了嘛?");
}
}
}
不會(huì)拋出任何異常
包裝類型做運(yùn)算操作比基本類型慢幾十倍,參考我的另外一篇文章http://www.itdecent.cn/p/54e5fa72d5b5
問:那么我們什么時(shí)候用包裝類型呢?
答:有三個(gè)合理的用處
- 1、作為集合中的元素、鍵和值。
- 2、在參數(shù)化類型中,必須使用包裝類。
- 3、進(jìn)行反射的方法調(diào)用時(shí),必須使用裝箱基本類型。
總之:當(dāng)可以選擇的時(shí)候,基本類型要優(yōu)于包裝類型?;绢愋透啙嵏焖?。
若有興趣,歡迎來加入群,【Java初學(xué)者學(xué)習(xí)交流群】:458430385,此群有Java開發(fā)人員、UI設(shè)計(jì)人員和前端工程師。有問必答,共同探討學(xué)習(xí),一起進(jìn)步!
歡迎關(guān)注我的微信公眾號(hào)【Java碼農(nóng)社區(qū)】,會(huì)定時(shí)推送各種干貨:
