国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

[Java5新特性]自動裝箱/拆箱

2019-11-15 00:24:30
字體:
來源:轉載
供稿:網友
[java5新特性]自動裝箱/拆箱自動裝箱/拆箱概述

Java中具有基本類型(int,double,float,long,boolean,char,byte,short)和基本類型包裝類(Integer,Double,Float,Long,Boolean,Char,Byte,Short),我們實現基本類型與包裝類之間的轉換基本有兩種方式:

  • 一種為JDK5之前的方式,比如Integer i = Integer.valueof(5);(這里5為基本類型int,Integer包裝類利用valueof()方法將其轉換為Integer類型)或者int i = i.intValue();(這里基本類型利用intValue()方法將Integer類型轉換為基本類型int)。
  • 一種為JDK5之后的方式,比如①Integer i = 5;或者②int i = new Integer(100);,這里基本類型與包裝類之間可直接操作,而①的操作就是自動裝箱,②的操作就是自動拆箱。
自動裝箱/拆箱原理

如果我們現在使用第二種方式進行直接賦值操作,代碼如下:

public class Demo {    @Test    public void demo() {        Integer integer = 5;        int i = new Integer(100);    }}

編寫完成的Java文件,在運行之前會被編譯成Class文件。現在我們將編譯后的Class文件,進行反編譯操作,得到如下代碼內容:

public class Demo {    @Test    public void demo() {        Integer integer = Integer.valueOf(5);        int i = new Integer(100).intValue();    }}

通過查看反編譯的代碼內容,我們得知在Java文件編譯后的內容與第一種方式的操作保持一致。這就說明實際上Java中基本類型與包裝類之間的轉換,在JDK5之后不再由我們手動操作,而是由Java編譯器幫助我們來完成,與Java的虛擬機是沒有任何關系的。

底層原理分析

到目前為止,我們已經基本掌握了Java5的自動裝箱與拆箱的內容。在實際開發中,目前基本使用的都是Java5之后的版本,所以自動裝箱與拆箱內容就不是那么重要了。 下面我們來看一個例子:

public class Demo {    @Test    public void demo2() {        Integer i1 = 100;        Integer i2 = 100;        boolean b1 = i1 == i2;        System.out.PRintln(b1);     //output    true        Integer i3 = 200;        Integer i4 = 200;        boolean b2 = i3 == i4;        System.out.println(b2);     //output    false    }}

在上面的例子中,變量Integer類型的i1,i2,i3和i4都是自動裝箱,但是最終比較的結果卻一個為true一個為false。這讓我們比較困惑,原因是什么呢?下面我們來還原一下自動裝箱,上面的代碼可以改寫成如下方式:

public class Demo {    @Test    public void demo3() {        Integer i1 = Integer.valueOf(100);        Integer i2 = Integer.valueOf(100);        boolean b1 = i1 == i2;        System.out.println(b1);     //output    true        Integer i3 = Integer.valueOf(200);        Integer i4 = Integer.valueOf(200);        boolean b2 = i3 == i4;        System.out.println(b2);     //output    false    }}

通過改寫之后的代碼,我們發現原來是Integer類型的valueOf()方法接收100和200返回的內容是不一樣的。那我們就需要看查看一下Integer類型的valueOf()方法的源代碼,它到底是怎么樣的。

public static Integer valueOf(int i) {    if (i >= IntegerCache.low && i <= IntegerCache.high)        return IntegerCache.cache[i + (-IntegerCache.low)];    return new Integer(i);}

通過查看源代碼我們發現,在Integer類的內部緩存了-128至127之間的256個Integer對象,如果valueOf()方法將這個范圍的int類型整數轉換成Integer對象時,會直接返回緩存中的內容,否則返回重新創建的Integer對象。 所以,在上面的例子中,整數100在Integer類的緩存之中,所以直接返回緩存內容。而整數200不在Integer類的緩存之中,所以需要重新創建Integer對象返回。而兩個Integer類型的對象做比較,是判斷對象地址是否相同,所以一個結果為true一個結果為false。


轉載說明:請注明本文作者及原文連接,謝謝!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 华池县| 玛纳斯县| 浦东新区| 阳曲县| 绥江县| 麟游县| 石城县| 惠来县| 阜康市| 建平县| 龙井市| 长兴县| 泾川县| 六枝特区| 绥德县| 玉田县| 昭觉县| 安仁县| 湘潭县| 潍坊市| 连山| 哈巴河县| 崇州市| 清水河县| 青河县| 广昌县| 澄江县| 连山| 延安市| 襄樊市| 八宿县| 湘潭市| 普安县| 朝阳市| 陵川县| 惠东县| 汝城县| 乐昌市| 东乡| 修文县| 阳山县|