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

首頁 > 編程 > Java > 正文

Java 裝箱與拆箱詳解及實例代碼

2019-11-26 13:16:59
字體:
供稿:網(wǎng)友

Java 裝箱與拆箱詳解

前言:

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

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

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

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

看下面一段代碼

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 falsem12 result false

“==”比較的是地址,而a和b兩個對象的地址不同,即是兩個對象,所以都是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/Integer;  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/lang/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/lang/StringBuilder;  41: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;  44: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/String;)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/Integer;  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/lang/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/lang/StringBuilder;  43: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;  46: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/String;)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 falsem22 result false

a和b仍是兩個對象

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/lang/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/lang/StringBuilder;  45: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;  48: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/String;)V  51: returnpublic 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/lang/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/lang/StringBuilder;  47: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;  50: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/String;)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 truem32 result false

為什么有第一個是true,第二個是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/Integer;  5:  astore_1  6:  bipush 100  8:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  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/lang/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/lang/StringBuilder;  37: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;  40: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/String;)V  43: returnpublic void m32(); Code:  0:  sipush 128  3:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  6:  astore_1  7:  sipush 128  10: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  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/lang/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/lang/StringBuilder;  39: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;  42: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/String;)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 truem42 result false

javap解析內(nèi)容

public void m41(); Code:  0:  bipush 100  2:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  5:  astore_1  6:  bipush 100  8:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  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/lang/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/lang/StringBuilder;  37: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;  40: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/String;)V  43: returnpublic void m42(); Code:  0:  sipush 128  3:  invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  6:  astore_1  7:  sipush 128  10: invokestatic  #49; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  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/lang/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/lang/StringBuilder;  39: invokevirtual  #70; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;  42: invokevirtual  #74; //Method java/io/PrintStream.println:(Ljava/lang/String;)V  45: return}

分析

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

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

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

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

下面是valueOf()具體實現(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返回的是緩存中的對象,所以兩次調(diào)用返回的是同一個對象。

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 惠州市| 乡宁县| 镇江市| 南和县| 丹寨县| 台湾省| 湘西| 商城县| 丰原市| 祁阳县| 调兵山市| 吉首市| 丹棱县| 丰镇市| 铜梁县| 临城县| 成安县| 澄城县| 广汉市| 三明市| 彭泽县| 固安县| 社会| 资阳市| 龙山县| 宜兰县| 南岸区| 壶关县| 怀宁县| 布拖县| 陵川县| 长岭县| 孟津县| 古蔺县| 崇左市| 宝丰县| 巨鹿县| 枝江市| 邹平县| 天祝| 武陟县|