簡介
Java 的每個基本類型都對應(yīng)了一個包裝類型,比如說 int 的包裝類型為 Integer,double 的包裝類型為 Double。基本類型和包裝類型的區(qū)別主要有以下 4 點(diǎn)
區(qū)別
區(qū)別1 包裝類型可以為 null,而基本類型不可以
例如Integer的默認(rèn)值是null,int的默認(rèn)值是0
它使得包裝類型可以應(yīng)用于 POJO 中,而基本類型則不行。因?yàn)閿?shù)據(jù)庫的查詢結(jié)果可能是 null,如果使用基本類型的話,因?yàn)橐詣硬鹣洌▽b類型轉(zhuǎn)為基本類型,比如說把 Integer 對象轉(zhuǎn)換成 int 值),就會拋出 NullPointerException 的異常。
區(qū)別2 包裝類型可用于泛型,而基本類型不可以
List<int> list = new ArrayList<>();
// 提示 Syntax error, insert "Dimensions" to complete ReferenceType
List<Integer> list = new ArrayList<>();
區(qū)別3 基本類型比包裝類型更高效,占用內(nèi)存更少
區(qū)別4 相同的一個數(shù)據(jù),包裝類生成的是兩個對象,其內(nèi)存地址不同
兩個包裝類型的值可以相同,但卻不相等:
Integer chenmo = new Integer(10);
Integer wanger = new Integer(10);
System.out.println(chenmo == wanger); // false
System.out.println(chenmo.equals(wanger )); // true
自動裝箱和自動拆箱
把基本類型轉(zhuǎn)換成包裝類型的過程叫做裝箱
反之,把包裝類型轉(zhuǎn)換成基本類型的過程叫做拆箱
要點(diǎn)
1、由于Integer變量實(shí)際上是對一個Integer對象的引用,所以兩個通過new生成的Integer變量永遠(yuǎn)是不相等的(因?yàn)閚ew生成的是兩個對象,其內(nèi)存地址不同)。
Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false
2、Integer變量和int變量比較時,只要兩個變量的值是向等的,則結(jié)果為true(因?yàn)榘b類Integer和基本數(shù)據(jù)類型int比較時,java會自動拆包裝為int,然后進(jìn)行比較,實(shí)際上就變?yōu)閮蓚€int變量的比較)
Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true
3、非new生成的Integer變量和new Integer()生成的變量比較時,結(jié)果為false。(因?yàn)榉莕ew生成的Integer變量指向的是java常量池中的對象,而new Integer()生成的變量指向堆中新建的對象,兩者在內(nèi)存中的地址不同)
Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false
4、對于兩個非new生成的Integer對象,進(jìn)行比較時,如果兩個變量的值在區(qū)間-128到127之間,則比較結(jié)果為true,如果兩個變量的值不在此區(qū)間,則比較結(jié)果為false
Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true
Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false