首頁 > Java > java教程 > Java 中的自動裝箱與拆箱

Java 中的自動裝箱與拆箱

PHPz
發布: 2024-08-30 16:06:21
原創
761 人瀏覽過

自動裝箱是 Java 編譯器在基本型別與其對應的包裝類別物件之間的自動轉換,即從 int 到 Integer、double 到 Double 等的轉換。拆箱是從包裝類別物件到其等效基本類型的自動轉換,即:整數轉int。該功能在 Java 1.5 版本中引入。

自動裝箱和拆箱在 Java 中如何運作?

編譯器在內部使用valueOf() 方法將基元轉換為對應的包裝物件(即自動裝箱),反之亦然,它使用intValue()、doubleValue() 等,就像拆箱的範例一樣。

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

java中的原始類型和包裝類別映射如下:

Primitive type Wrapper class
boolean Boolean
byte Byte
char Character
float Float
int Integer
long Long
short Short
double Double

範例

讓我們採用一個整數陣列並利用拆箱概念。

import java.util.ArrayList;
public class MyClass {
public static void main(String args[]) <em>{</em>
ArrayList<Integer> intlist = new ArrayList<Integer>();
//wrapper Integer objects being added here
intlist.add(1);
interest.add(2);
//auto-unboxing is happening here
int x = intlist.get(0);
System.out.println(x);
}
}
登入後複製

因此,在上面的例子中,當給 x 添加值時,我們看到 x 看起來是原始的。因此,當分配完成時,拆箱會自動發生。

public class MyClass {
public static void main(String args[]) {
Integer sum =0;
for(int i=0;i<10;i++)
{
sum = sum + i;
}
System.out.println(sum);
}
}
登入後複製
  • 上面,我們展示了這方面的第二個範例,其中呈現了一個典型場景。如果你熟悉Java中的對象創建,你可以看到“Integer sum = 0”聲明了一個對象,當我們在for循環中進行計算時,我們可以看到原始值“i”被添加到包裝“總和”
  • 因此,我們可以發現,首先,會發生從包裝器到基元的轉換,因為「+」運算子僅適用於基元;因此,物件拆箱將首先發生。然後,將進行計算,之後將再次進行物件自動裝箱。然後,該值將被指派給變數“sum”。
  • 這會給 JVM 帶來不必要的開銷,因為許多中間 Integer 物件將被建立然後銷毀(稍後被垃圾收集),從而導致速度減慢。因此,此類邏輯需謹慎處理。
  • 讓我們看看這些情況與一般看法有何不同。為了理解自動裝箱和拆箱,我們將使用一些編碼。

考慮下面的程式碼片段;這會輸出什麼?

public class Main
{
public static void main(String[] args) {
Integer m = 34123;
Integer x = 34123;
System.out.println(x==m);
}
}
登入後複製
  • 如果你說“真”,那麼你就是“假”,因為輸出也是“假”。由於我們可以比較從 -128 到 127 的整數範圍,因此超出此範圍的值需要拆箱。
  • 因此,我們必須比較上述整數的 intValue() 。目前,編譯器使用 valueOf() 屬性來執行此操作。
  • 可能,如果這落在上面引用的範圍內,那麼上面的程式碼將給出「true」 - 因為它將首先引用整數文字池進行比較。
public class Main
{
public static void main(String[] args) {
Integer m = 100;
Integer x = 100;
System.out.println(x==m);
}
}
登入後複製

這將計算為「true」值,因為文字池中存在 100。

使用方法重載在 Java 中自動裝箱與拆箱

  • 在我們用方法重載標記自動裝箱和拆箱之前,我們假設讀者了解方法重載的概念。我們只會提供一些見解,有關更多信息,請參閱 Oracle 的相關文件。
  • 方法重載是透過使用相同的方法名稱和不同數量的輸入參數、具有相同名稱的不同資料類型的變數等來呈現任何計算方法的多個變體的過程。
  • 讓我們舉個例子來更好地理解它。輸出影像如下所示。
public class Main
{
public static void main(String[] args) {
Overload obj =  new Overload();
int i =5;
obj.printval(5);
Integer m = i;
obj.printval(m);
}
}
class Overload
{
public void printval(int i)
{
System.out.println("printing the unboxed value "+ i);
}
public void printval(Integer i)
{
System.out.println("printing the autoboxed value "+ i);
}
}
登入後複製

輸出:

Java 中的自動裝箱與拆箱

注意: 您可以在任何 IDE 中執行上述程序以獲得上述輸出。
  • 因此,上述行為明確顯示自動裝箱技術對於重載概念很有用,在編碼時應謹慎使用。

Java 中自動裝箱與拆箱的優點

  • 編譯器會自動進行適當的轉換。
  • 開發人員編寫更少的程式碼,從而創建更清晰的程式碼。
  • 無需手動型別轉換表達式。

 結論

我們了解了自動裝箱和拆箱的用例,以及這個概念的隱含性及其優缺點。編碼時必須謹慎使用;否則,它會增加不必要的計算轉換開銷。因此,轉換必須在原語中完成,以避免過多的垃圾收集開銷和臨時物件建立。我們也看到了 Java 中帶有重載概念的自動裝箱的用例。您可以同時檢查更多限制。

以上是Java 中的自動裝箱與拆箱的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板