Java 进阶——自动装箱和自动拆箱
1、什么是自動(dòng)裝箱拆箱
基本數(shù)據(jù)類型的自動(dòng)裝箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0開始提供的功能。
一般我們要?jiǎng)?chuàng)建一個(gè)類的對(duì)象實(shí)例的時(shí)候,我們會(huì)這樣:
?Class a = new Class(parameter);
?當(dāng)我們創(chuàng)建一個(gè)Integer對(duì)象時(shí),卻可以這樣:
?Integer i = 100; (注意:不是 int i = 100; )
實(shí)際上,執(zhí)行上面那句代碼的時(shí)候,系統(tǒng)為我們執(zhí)行了:Integer i = Integer.valueOf(100);
此即基本數(shù)據(jù)類型的自動(dòng)裝箱功能。
?
2、基本數(shù)據(jù)類型與對(duì)象的差別
基本數(shù)據(jù)類型不是對(duì)象,也就是使用int、double、boolean等定義的變量、常量。
基本數(shù)據(jù)類型沒有可調(diào)用的方法。
eg:? int t = 1;???? t.? 后面是沒有方法滴。
?Integer t =1; t.? 后面就有很多方法可讓你調(diào)用了。
1)什么時(shí)候自動(dòng)裝箱
例如:Integer i = 100;
相當(dāng)于編譯器自動(dòng)為您作以下的語法編譯:Integer i = Integer.valueOf(100);
2)什么時(shí)候自動(dòng)拆箱
自動(dòng)拆箱(unboxing),也就是將對(duì)象中的基本數(shù)據(jù)從對(duì)象中自動(dòng)取出。如下可實(shí)現(xiàn)自動(dòng)拆箱:
[java]?view plaincopy在進(jìn)行運(yùn)算時(shí),也可以進(jìn)行拆箱。
[java]?view plaincopy?
3、Integer的自動(dòng)裝箱
[java]?view plaincopy輸出的結(jié)果為:
[java]?view plaincopy?說明:
equals() 比較的是兩個(gè)對(duì)象的值(內(nèi)容)是否相同。
"==" 比較的是兩個(gè)對(duì)象的引用(內(nèi)存地址)是否相同,也用來比較兩個(gè)基本數(shù)據(jù)類型的變量值是否相等。?
?
前面說過,int 的自動(dòng)裝箱,是系統(tǒng)執(zhí)行了 Integer.valueOf(int i),先看看Integer.Java的源碼:
[java]?view plaincopy對(duì)于–128到127(默認(rèn)是127)之間的值,Integer.valueOf(int i) 返回的是緩存的Integer對(duì)象(并不是新建對(duì)象)
所以范例中,i3 與 i4實(shí)際上是指向同一個(gè)對(duì)象。
而其他值,執(zhí)行Integer.valueOf(int i) 返回的是一個(gè)新建的 Integer對(duì)象,所以范例中,i1與i2 指向的是不同的對(duì)象。
當(dāng)然,當(dāng)不使用自動(dòng)裝箱功能的時(shí)候,情況與普通類對(duì)象一樣,請(qǐng)看下例:
[java]?view plaincopy?
4、String 的拆箱裝箱
先看個(gè)例子:
[java]?view plaincopy這個(gè)怎么解釋呢?貌似看不出什么。那再看個(gè)例子。
[java]?view plaincopy 第二個(gè)例子中,e的初始值與d并不同,因此e與d是各自創(chuàng)建了個(gè)對(duì)象,(e==d)為false 。
同理可知,第一個(gè)例子中的str3與str4也是各自new了個(gè)對(duì)象,而str1與str2卻是引用了同一個(gè)對(duì)象。
總結(jié)
以上是生活随笔為你收集整理的Java 进阶——自动装箱和自动拆箱的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Workbox.routing v3.x
- 下一篇: java美元兑换,(Java实现) 美元