Java 中的自動裝箱和拆箱

Sheeraz Gul 2023年10月12日
  1. Java 中的自動裝箱
  2. Java 中的拆箱
Java 中的自動裝箱和拆箱

自動裝箱將原始資料型別轉換為其等效的包裝器型別,而拆箱是將包裝器型別轉換為原始資料型別。此功能內建在 Java 中。

本教程描述並演示了在 Java 中使用自動裝箱和拆箱。

Java 中的自動裝箱

如上所述,自動裝箱將原始資料型別轉換為與物件相同的包裝型別類。例如,longLongintInteger

這些原始資料型別及其對應的包裝型別類的列表如下。

原始型別 封裝器型別
int Integer
boolean Boolean
double Double
float Float
byte Byte
char Character
long Long
short Short

我們可以在 Java 中使用自動裝箱的三種情況:

  1. 我們必須將原始資料型別作為引數傳遞給任何方法。該方法需要一個相應的包裝類物件。
  2. 將原始資料型別分配給具有相應包裝類的變數時。
  3. 在使用集合框架類時,編譯器必須在 Java 中執行自動裝箱。

有三種情況。讓我們嘗試為每種情況建立一個示例。請參閱第一種情況的示例:

package Delfstack;

public class Autoboxing_Test {
  public static void Number(Integer x) {
    System.out.println(x);
  }
  public static void main(String[] args) {
    // Compiler performs Autoboxing here. it converts primitive type to wrapper type Integer object.
    int x = 10;
    Number(x);
  }
}

我們將原始型別 int 作為引數傳遞給需要包裝類 Integer 的方法;編譯器將在此處執行自動裝箱。見輸出:

10

請參閱第二種情況的示例:

package Delfstack;

public class Autoboxing_Test {
  public static void main(String[] args) {
    // Assigning primitive long value to Wrapper Long variable x. Compiler performs autoboxing
    Long x = 430L;
    // Assigning primitive char value to Wrapper Character variable y. Compiler performs autoboxing
    Character y = 'a';
    System.out.println(x);
    System.out.println(y);
  }
}

我們將原始資料型別值分配給包裝器型別變數,編譯器執行自動裝箱。見輸出:

430
a

請參見第三種情況的示例:

package Delfstack;

import java.util.ArrayList;

public class Autoboxing_Test {
  public static void main(String[] args) {
    ArrayList<Long> Long_List = new ArrayList<Long>();
    // while working with collections framework the compiler performs autoboxing
    Long_List.add(220L);
    Long_List.add(330L);
    System.out.println(Long_List);
  }
}

在使用集合框架類時,編譯器必須像上面的程式碼一樣在 Java 中執行自動裝箱;我們將原始型別 long 元素新增到包裝型別 Long 列表中。見輸出:

[220, 330]

Java 中的拆箱

Java 中的拆箱將包裝類的物件轉換為相同的原始資料型別;這是自動裝箱的相反操作。例如,將 Integer 轉換為 intLong 轉換為 long,前面的表格也可以用於裝箱,反之亦然。

拆箱也可以應用於三種情況:

  1. 將包裝類的物件傳遞給需要原始型別值的方法時。
  2. 當包裝類物件被賦值給對應的原始變數時。
  3. 在使用集合框架時。

讓我們為 Java 中的每種情況嘗試一個示例。請參閱第一種情況的示例:

package Delfstack;

public class Unboxing_Test {
  public static void Number(int x) {
    System.out.println(x);
  }
  public static void main(String[] args) {
    Integer x = new Integer(340);
    // We passed Integer wrapper class object, the compiler will convert it to int because method
    // requires int
    Number(x);
  }
}

編譯器將在將包裝類的物件傳遞給需要原始型別值的方法時執行拆箱。見輸出:

340

第二種情況的例子:

package Delfstack;

public class Unboxing_Test {
  public static void main(String[] args) {
    Long x = new Long(340L);
    Integer y = new Integer(450);
    // Performing unboxing here. assigning Long object to primitive long type similarly Integer to
    // int
    long a = x;
    int b = y;

    System.out.println(a);
    System.out.println(b);
  }
}

當包裝類物件分配給相應的原始變數時,編譯器將執行拆箱。見輸出:

340
450

第三種情況的示例:

package Delfstack;

import java.util.ArrayList;

public class Unboxing_Test {
  public static void main(String[] args) {
    ArrayList<Long> Long_List = new ArrayList<Long>();
    Long_List.add(230L);
    Long_List.add(340L);
    Long_List.add(450L);
    // The get method returns an Long object and we assigned it to the long primitive type
    long x = (long) Long_List.get(0);
    long y = (long) Long_List.get(1);
    long z = (long) Long_List.get(2);

    System.out.println(x);
    System.out.println(y);
    System.out.println(z);
  }
}

在使用像 ArrayList 這樣的集合框架時,當我們嘗試將 ArrayList 列表元素分配給原始型別變數時,編譯器會執行拆箱。見輸出:

230
340
450
作者: Sheeraz Gul
Sheeraz Gul avatar Sheeraz Gul avatar

Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.

LinkedIn Facebook