<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. java語言

    Java裝箱與拆箱詳解(附實例代碼)

    時間:2025-02-11 12:51:19 java語言 我要投稿
    • 相關推薦

    Java裝箱與拆箱詳解(附實例代碼)

      本文是百分網小編搜索整理的主要介紹Java 裝箱與拆箱詳解及實例代碼的相關資料,對java 的裝箱及拆箱進行了基本概念詳解及簡單使用,供參考學習,希望對大家有所幫助!想了解更多相關信息請持續關注我們應屆畢業生考試網!

      前言:

      要理解裝箱和拆箱的概念,就要理解Java數據類型

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

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

      Integer a = 100;         這是自動裝箱 (編譯器調用的是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));

      }

      }

      打印結果是什么?

      m11 result false

      m12 result false

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

      通過javap解析字節碼,內容如下

      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));

      }

      }

      打印結果是

      m21 result false

      m22 result false

      a和b仍是兩個對象

      javap解析內容

      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));

      }

      }

      打印結果

      m31 result true

      m32 result false

      為什么有第一個是true,第二個是false呢?觀察javap解析的數據

      javap解析內容

      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));

      }

      }

      打印結果

      m41 result true

      m42 result false

      javap解析內容

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

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

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

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

      下面是valueOf()具體實現

      /**

      * 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】之間的數字,valueOf返回的是緩存中的對象,所以兩次調用返回的是同一個對象。

    【Java裝箱與拆箱詳解(附實例代碼)】相關文章:

    Java自動裝箱與拆箱及其陷阱分析10-11

    Java實現在不同線程中運行的代碼實例詳解06-11

    java中通用的線程池實例代碼08-27

    Java內部類詳解及實例分析06-25

    C語言合并排序及實例代碼詳解11-02

    C語言文件操作解析詳解及實例代碼10-02

    C語言奇偶排序算法詳解及實例代碼10-30

    C語言中文件操作詳解及實例代碼08-24

    C語言中getch()函數詳解(附實例)08-24

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人