日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java 进阶——自动装箱和自动拆箱

發(fā)布時(shí)間:2023/12/9 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 进阶——自动装箱和自动拆箱 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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
  • Integer?i?=?10;?//裝箱???
  • int?t?=?i;?//拆箱,實(shí)際上執(zhí)行了?int?t?=?i.intValue();??
  • 在進(jìn)行運(yùn)算時(shí),也可以進(jìn)行拆箱。

    [java]?view plaincopy
  • Integer?i?=?10;???
  • System.out.println(i++);???
  • ?

    3、Integer的自動(dòng)裝箱

    [java]?view plaincopy
  • //在-128~127?之外的數(shù)??
  • ?Integer?i1?=200;????
  • ?Integer?i2?=200;????????????
  • ?System.out.println("i1==i2:?"+(i1==i2));?????????????????????
  • ?//?在-128~127?之內(nèi)的數(shù)??
  • ?Integer?i3?=100;????
  • ?Integer?i4?=100;????
  • ?System.out.println("i3==i4:?"+(i3==i4));??
  • 輸出的結(jié)果為:

    [java]?view plaincopy
  • i1==i2:?false??????
  • i3==i4:?true??
  • ?說明:

    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
  • public?static?Integer?valueOf(int?i)?{???
  • ????if(i?>=?-128?&&?i?<=?IntegerCache.high)  //?沒有設(shè)置的話,IngegerCache.high?默認(rèn)是127???
  • ????????return?IntegerCache.cache[i?+?128];???
  • ????else??
  • ????????return?new?Integer(i);???
  • }???
  • 對(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
  • Integer?i3?=new?Integer(100);???
  • Integer?i4?=new?Integer(100);???
  • System.out.println("i3==i4:?"+(i3==i4));//顯示false??
  • ?

    4、String 的拆箱裝箱

    先看個(gè)例子:

    [java]?view plaincopy
  • String?str1?="abc";??
  • String?str2?="abc";??
  • System.out.println(str2==str1);?//輸出為?true???
  • System.out.println(str2.equals(str1));?//輸出為?true???
  • ????
  • String?str3?=new?String("abc");??
  • String?str4?=new?String("abc");???
  • System.out.println(str3==str4);?//輸出為?false???
  • System.out.println(str3.equals(str4));?//輸出為?true??
  • 這個(gè)怎么解釋呢?貌似看不出什么。那再看個(gè)例子。

    [java]?view plaincopy
  • String?d?="2";???
  • String?e?="23";??
  • e?=?e.substring(0,?1);??
  • System.out.println(e.equals(d));?//輸出為?true???
  • System.out.println(e==d);?//輸出為?false???
  • 第二個(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。