亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java 裝箱與拆箱詳解及實(shí)例代碼

 更新時(shí)間:2017年01月11日 09:49:32   投稿:lqh  
這篇文章主要介紹了Java 裝箱與拆箱詳解及實(shí)例代碼的相關(guān)資料,這里對(duì)java 的裝箱及拆箱進(jìn)行了基本概念詳解及簡單使用,需要的朋友可以參考下

Java 裝箱與拆箱詳解

前言:

要理解裝箱和拆箱的概念,就要理解Java數(shù)據(jù)類型

裝箱:把基本類型用它們相應(yīng)的引用類型包裝起來,使其具有對(duì)象的性質(zhì)。int包裝成Integer、float包裝成Float

拆箱:和裝箱相反,將引用類型的對(duì)象簡化成值類型的數(shù)據(jù)

Integer a = 100;         這是自動(dòng)裝箱 (編譯器調(diào)用的是static Integer valueOf(int i))
int   b = new Integer(100); 這是自動(dòng)拆箱

看下面一段代碼

m1

public class DataType {
 
  public static void main(String args[]) {
    DataType dt = new DataType();
    dt.m11();
    dt.m12();
     
  }
 
  public void m11() {
    Integer a = new Integer(100);
    Integer b = 100;
    System.out.println("m11 result " + (a == b));
  }
 
  public void m12() {
    Integer a = new Integer(128);
    Integer b = 128;
    System.out.println("m12 result " + (a == b));
  }
 
   
}

  打印結(jié)果是什么?

m11 result false
m12 result false

“==”比較的是地址,而a和b兩個(gè)對(duì)象的地址不同,即是兩個(gè)對(duì)象,所以都是false

通過javap解析字節(jié)碼,內(nèi)容如下

public void m11();
 Code:
  0:  new   #44; //class java/lang/Integer
  3:  dup
  4:  bipush 100
  6:  invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  9:  astore_1
  10: bipush 100
  12: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  15: astore_2
  16: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  19: new   #59; //class java/lang/StringBuilder
  22: dup
  23: ldc   #61; //String m11 result
  25: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  28: aload_1
  29: aload_2
  30: if_acmpne    37
  33: iconst_1
  34: goto  38
  37: iconst_0
  38: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  41: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  44: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  47: return
 
public void m12();
 Code:
  0:  new   #44; //class java/lang/Integer
  3:  dup
  4:  sipush 128
  7:  invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  10: astore_1
  11: sipush 128
  14: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  17: astore_2
  18: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  21: new   #59; //class java/lang/StringBuilder
  24: dup
  25: ldc   #82; //String m12 result
  27: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  30: aload_1
  31: aload_2
  32: if_acmpne    39
  35: iconst_1
  36: goto  40
  39: iconst_0
  40: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  43: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  46: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  49: return
</init></init></init></init>
 

m2

public class DataType {
 
  public static void main(String args[]) {
    DataType dt = new DataType();
    dt.m21();
    dt.m22();
  }
 
  public void m21() {
    Integer a = new Integer(100);
    Integer b = new Integer(100);
    System.out.println("m21 result " + (a == b));
  }
 
  public void m22() {
    Integer a = new Integer(128);
    Integer b = new Integer(128);
    System.out.println("m22 result " + (a == b));
  }
 
   
}

  打印結(jié)果是

m21 result false
m22 result false

a和b仍是兩個(gè)對(duì)象

javap解析內(nèi)容

public void m21();
 Code:
  0:  new   #44; //class java/lang/Integer
  3:  dup
  4:  bipush 100
  6:  invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  9:  astore_1
  10: new   #44; //class java/lang/Integer
  13: dup
  14: bipush 100
  16: invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  19: astore_2
  20: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  23: new   #59; //class java/lang/StringBuilder
  26: dup
  27: ldc   #84; //String m21 result
  29: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  32: aload_1
  33: aload_2
  34: if_acmpne    41
  37: iconst_1
  38: goto  42
  41: iconst_0
  42: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  45: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  48: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  51: return

public void m22();
 Code:
  0:  new   #44; //class java/lang/Integer
  3:  dup
  4:  sipush 128
  7:  invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  10: astore_1
  11: new   #44; //class java/lang/Integer
  14: dup
  15: sipush 128
  18: invokespecial  #46; //Method java/lang/Integer."<init>":(I)V
  21: astore_2
  22: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  25: new   #59; //class java/lang/StringBuilder
  28: dup
  29: ldc   #86; //String m22 result
  31: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  34: aload_1
  35: aload_2
  36: if_acmpne    43
  39: iconst_1
  40: goto  44
  43: iconst_0
  44: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  47: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  50: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  53: return

m3

public class DataType {
 
  public static void main(String args[]) {
    DataType dt = new DataType();
    dt.m31();
    dt.m32();
  }
 
  public void m31() {
    Integer a = 100;
    Integer b = 100;
    System.out.println("m31 result " + (a == b));
  }
 
  public void m32() {
    Integer a = 128;
    Integer b = 128;
    System.out.println("m32 result " + (a == b));
  }
 
 
}

  打印結(jié)果

m31 result true
m32 result false

為什么有第一個(gè)是true,第二個(gè)是false呢?觀察javap解析的數(shù)據(jù)

javap解析內(nèi)容

public void m31();
 Code:
  0:  bipush 100
  2:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  5:  astore_1
  6:  bipush 100
  8:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  11: astore_2
  12: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  15: new   #59; //class java/lang/StringBuilder
  18: dup
  19: ldc   #88; //String m31 result
  21: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  24: aload_1
  25: aload_2
  26: if_acmpne    33
  29: iconst_1
  30: goto  34
  33: iconst_0
  34: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  37: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  40: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  43: return

public void m32();
 Code:
  0:  sipush 128
  3:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  6:  astore_1
  7:  sipush 128
  10: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  13: astore_2
  14: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  17: new   #59; //class java/lang/StringBuilder
  20: dup
  21: ldc   #90; //String m32 result
  23: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  26: aload_1
  27: aload_2
  28: if_acmpne    35
  31: iconst_1
  32: goto  36
  35: iconst_0
  36: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  39: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  42: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  45: return

m4

public class DataType {
 
  public static void main(String args[]) {
    DataType dt = new DataType();
    dt.m41();
    dt.m42();
  }
 
 
  public void m41() {
    Integer a = Integer.valueOf(100);
    Integer b = 100;
    System.out.println("m41 result " + (a == b));
  }
   
  public void m42() {
    Integer a = Integer.valueOf(128);
    Integer b = 128;
    System.out.println("m42 result " + (a == b));
  }
}

  打印結(jié)果

m41 result true
m42 result false

javap解析內(nèi)容

public void m41();
 Code:
  0:  bipush 100
  2:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  5:  astore_1
  6:  bipush 100
  8:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  11: astore_2
  12: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  15: new   #59; //class java/lang/StringBuilder
  18: dup
  19: ldc   #92; //String m41 result
  21: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  24: aload_1
  25: aload_2
  26: if_acmpne    33
  29: iconst_1
  30: goto  34
  33: iconst_0
  34: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  37: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  40: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  43: return

public void m42();
 Code:
  0:  sipush 128
  3:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  6:  astore_1
  7:  sipush 128
  10: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
  13: astore_2
  14: getstatic    #53; //Field java/lang/System.out:Ljava/io/PrintStream;
  17: new   #59; //class java/lang/StringBuilder
  20: dup
  21: ldc   #94; //String m42 result
  23: invokespecial  #63; //Method java/lang/StringBuilder."<init>":(Ljava/la
ng/String;)V
  26: aload_1
  27: aload_2
  28: if_acmpne    35
  31: iconst_1
  32: goto  36
  35: iconst_0
  36: invokevirtual  #66; //Method java/lang/StringBuilder.append:(Z)Ljava/la
ng/StringBuilder;
  39: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/l
ang/String;
  42: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/St
ring;)V
  45: return

}

分析

javap是Java自帶的一個(gè)工具,可以反編譯,也可以查看Java編譯器生成的字節(jié)碼(上面代碼只使用了javap -c DataType),是分析代碼的一個(gè)好工具,具體怎么使用請(qǐng)Google一下

先看一下m4,為什么運(yùn)行結(jié)果中出現(xiàn)了“true”呢,true說明a、b是同一個(gè)對(duì)象。 

但a對(duì)象是調(diào)用Integer.valueOf()生成的,b是通過自動(dòng)裝箱生成的對(duì)象,為什么會(huì)是同一個(gè)對(duì)象呢?再看一下字節(jié)碼吧,畢竟Java程序是依靠虛擬機(jī)運(yùn)行字節(jié)碼實(shí)現(xiàn)的。

m41這個(gè)方法只適用了一次valueOf(),但字節(jié)碼中出現(xiàn)了兩次,說明自動(dòng)裝箱時(shí)也調(diào)用了valueOf()。

下面是valueOf()具體實(shí)現(xiàn)

/**
 * Returns a <tt>Integer</tt> instance representing the specified
 * <tt>int</tt> value.
 * If a new <tt>Integer</tt> instance is not required, this method
 * should generally be used in preference to the constructor
 * {@link #Integer(int)}, as this method is likely to yield
 * significantly better space and time performance by caching
 * frequently requested values.
 *
 * @param i an <code>int</code> value.
 * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
 * @since 1.5
 */
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache 
  return IntegerCache.cache[i + offset];
}
  return new Integer(i);
}

在【-128,127】之間的數(shù)字,valueOf返回的是緩存中的對(duì)象,所以兩次調(diào)用返回的是同一個(gè)對(duì)象。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • mybatis使用collection嵌套查詢的實(shí)現(xiàn)

    mybatis使用collection嵌套查詢的實(shí)現(xiàn)

    本文主要介紹了mybatis使用collection嵌套查詢的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • springboot整合springsecurity與mybatis-plus的簡單實(shí)現(xiàn)

    springboot整合springsecurity與mybatis-plus的簡單實(shí)現(xiàn)

    Spring Security基于Spring開發(fā),項(xiàng)目中如果使用Spring作為基礎(chǔ),配合Spring Security做權(quán)限更加方便,而Shiro需要和Spring進(jìn)行整合開發(fā)。因此作為spring全家桶中的Spring Security在java領(lǐng)域很常用
    2021-10-10
  • java實(shí)現(xiàn)無符號(hào)數(shù)轉(zhuǎn)換、字符串補(bǔ)齊、md5、uuid、隨機(jī)數(shù)示例

    java實(shí)現(xiàn)無符號(hào)數(shù)轉(zhuǎn)換、字符串補(bǔ)齊、md5、uuid、隨機(jī)數(shù)示例

    這篇文章主要介紹了java實(shí)現(xiàn)無符號(hào)數(shù)轉(zhuǎn)換、字符串補(bǔ)齊、md5、uuid、隨機(jī)數(shù)示例,需要的朋友可以參考下
    2014-04-04
  • SpringSecurity授權(quán)實(shí)現(xiàn)基本思路

    SpringSecurity授權(quán)實(shí)現(xiàn)基本思路

    本文介紹了SpringSecurity中使用FilterSecurityInterceptor進(jìn)行權(quán)限校驗(yàn)的基本方法,通過SecurityContextHolder獲取Authentication中的權(quán)限信息,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • springboot集成mybatisplus實(shí)例詳解

    springboot集成mybatisplus實(shí)例詳解

    這篇文章主要介紹了springboot集成mybatisplus實(shí)例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 關(guān)于application.yml數(shù)據(jù)庫配置方式

    關(guān)于application.yml數(shù)據(jù)庫配置方式

    這篇文章主要介紹了關(guān)于application.yml數(shù)據(jù)庫配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java解壓jar包和壓縮jar包的簡單步驟

    java解壓jar包和壓縮jar包的簡單步驟

    JAR(Java Archive)是Java的歸檔文件,它是一種與平臺(tái)無關(guān)的文件格式,它允許將許多文件組合成一個(gè)壓縮文件,這篇文章主要介紹了java解壓jar包和壓縮jar包的簡單步驟,需要的朋友可以參考下
    2024-12-12
  • Java?IO流與NIO技術(shù)綜合應(yīng)用詳細(xì)實(shí)例代碼

    Java?IO流與NIO技術(shù)綜合應(yīng)用詳細(xì)實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java?IO流與NIO技術(shù)綜合應(yīng)用的相關(guān)資料,文中包括了字節(jié)流和字符流,以及它們的高級(jí)特性如緩沖區(qū)、序列化和反序列化,同時(shí)還介紹了NIO中的通道和緩沖區(qū),以及選擇器的使用,需要的朋友可以參考下
    2024-12-12
  • Java操作Excel的示例詳解

    Java操作Excel的示例詳解

    在平時(shí)可以使用IO流對(duì)Excle進(jìn)行操作,但是現(xiàn)在使用更加方便的第三方組件來實(shí)現(xiàn)。本文就來和大家聊聊Java如何通過第三方組件實(shí)現(xiàn)操作Excel,需要的可以參考一下
    2023-01-01
  • 關(guān)于連接遠(yuǎn)程redis的流程

    關(guān)于連接遠(yuǎn)程redis的流程

    這篇文章主要介紹了關(guān)于連接遠(yuǎn)程redis的流程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評(píng)論