1. 程式人生 > >裝箱和拆箱的區別與詳解

裝箱和拆箱的區別與詳解

深入剖析Java中的裝箱和拆箱

  自動裝箱和拆箱問題是Java中一個老生常談的問題了,今天我們就來一些看一下裝箱和拆箱中的若干問題。本文先講述裝箱和拆箱最基本的東西,再來看一下面試筆試中經常遇到的與裝箱、拆箱相關的問題。

  以下是本文的目錄大綱:

  一.什麼是裝箱?什麼是拆箱?

  二.裝箱和拆箱是如何實現的

  三.面試中相關的問題

  若有不正之處,請諒解和批評指正,不勝感激。

  請尊重作者勞動成果,轉載請標明原文連結:

一.什麼是裝箱?什麼是拆箱?

  在前面的文章中提到,Java為每種基本資料型別都提供了對應的包裝器型別,至於為什麼會為每種基本資料型別提供包裝器型別在此不進行闡述,有興趣的朋友可以查閱相關資料。在Java SE5之前,如果要生成一個數值為10的Integer物件,必須這樣進行:

1 Integer i = new Integer(10);

  而在從Java SE5開始就提供了自動裝箱的特性,如果要生成一個數值為10的Integer物件,只需要這樣就可以了:

1 Integer i = 10;

  這個過程中會自動根據數值建立對應的 Integer物件,這就是裝箱。

  那什麼是拆箱呢?顧名思義,跟裝箱對應,就是自動將包裝器型別轉換為基本資料型別:

1 2 Integer i = 10;  //裝箱 int n = i;   //拆箱

  簡單一點說,裝箱就是  自動將基本資料型別轉換為包裝器型別;拆箱就是  自動將包裝器型別轉換為基本資料型別。

  下表是基本資料型別對應的包裝器型別:

int(4位元組) Integer
byte(1位元組) Byte
short(2位元組) Short
long(8位元組) Long
float(4位元組) Float
double(8位元組)
Double
char(2位元組) Character
boolean(未定) Boolean

二.裝箱和拆箱是如何實現的

  上一小節瞭解裝箱的基本概念之後,這一小節來了解一下裝箱和拆箱是如何實現的。

  我們就以Interger類為例,下面看一段程式碼:

1 2 3 4 5 6 7 public class Main { public static void main(String[] args) { Integer i = 10; int n = i; } }

  反編譯class檔案之後得到如下內容:

  

  從反編譯得到的位元組碼內容可以看出,在裝箱的時候自動呼叫的是Integer的valueOf(int)方法。而在拆箱的時候自動呼叫的是Integer的intValue方法。

  其他的也類似,比如Double、Character,不相信的朋友可以自己手動嘗試一下。

  因此可以用一句話總結裝箱和拆箱的實現過程:

  裝箱過程是通過呼叫包裝器的valueOf方法實現的,而拆箱過程是通過呼叫包裝器的 xxxValue方法實現的。(xxx代表對應的基本資料型別)。

三.面試中相關的問題

  雖然大多數人對裝箱和拆箱的概念都清楚,但是在面試和筆試中遇到了與裝箱和拆箱的問題卻不一定會答得上來。下面列舉一些常見的與裝箱/拆箱有關的面試題。

1.下面這段程式碼的輸出結果是什麼?

1 2 3 4 5 6 7 8 9 10 11 12

相關推薦

Javascript中callapply的區別

轉自:http://www.7old.com/jiaocheng/show-1412.html在js中call和apply它們的作用都是將函式繫結到另外一個物件上去執行,兩者僅在定義引數方式有所區別,下面我來給大家介紹一下call和apply用法。 在web前端開發過程中

裝箱區別

深入剖析Java中的裝箱和拆箱   自動裝箱和拆箱問題是Java中一個老生常談的問題了,今天我們就來一些看一下裝箱和拆箱中的若干問題。本文先講述裝箱和拆箱最基本的東西,再來看一下面試筆試中經常遇到的與裝箱、拆箱相關的問題。   以下是本文的目錄大綱:

裝箱效能損耗

拆箱是將引用型別轉換為值型別 ;反之,裝箱! 利用裝箱和拆箱功能,可通過允許值型別的任何值與Object 型別的值相互轉換,將值型別與引用型別連結起來 ; 例如: int val = 100; object obj = val; Cons

裝箱-值型別引用型別的區別

一、概述 在C#中,資料根據變數的型別以兩種方式中的一種儲存在一個變數中。變數的型別分為兩種:引用型別和值型別,這也是CLR支援的兩種型別。   二、定義 1.引用型別: 分配在堆上的型別稱為引用型別。 解析:一個可以稱為”類“的型別都是引用型別。 引用型別總是從託管堆上分配的,常用的語法就是N

轉 C# 裝箱[整理]

collect 調用 原理 本質 reger truct 以及 gree gre 1、 裝箱和拆箱是一個抽象的概念 2、 裝箱是將值類型轉換為引用類型 ;拆箱是將引用類型轉換為值類型 利用裝箱和拆箱功能,可通過允許值類型的任何值與O

[DotNet]深入理解C#的裝箱

csharp 簡單 部分 nbsp pre 需要 避免 兩個 value 裝箱和拆箱是值類型和引用類型之間相互轉換是要執行的操作。 1. 裝箱在值類型向引用類型轉換時發生 2. 拆箱在引用類型向值類型轉換時發生 光上述兩句話不難理解,但是往深處了解,就需要一些篇幅來

C# 裝箱[整理](轉)

reger 循環 賦值 c# 通用 不出 mem 功能 數據的操作 //1、 // 裝箱和拆箱是一個抽象的概念 //2、 // 裝箱是將值類型轉換為引用類型 ;拆箱是將引用類型轉換為值類型 // 利用裝箱和拆箱功能,可通過允許值類型的任何值

java-裝箱

占用 基本類 ole main 分析 實現 生成 結果 不同 一、什麽是裝箱拆箱?   java為每種基本數據類型提供了對應的包裝器類型 Integer i = 10; 拿煙的手微微顫抖:這樣就生成了一個特數值為10的Integer對象,這個過程中會自動創建對應的Int

裝箱

說明 沒有 復制 har add 類型轉換 width console 內存 裝箱:將值類型轉換成引用類型 int i = 1; //聲明一個值類型的變量,並給其賦值 object j = i;//將值類型賦值給引用類型,這裏就發生了裝箱操作,這個過程是隱式的。註意:此時

自動裝箱的原理

port post csdn com details www. www art .com http://blog.csdn.net/jairuschan/article/details/7513045 http://www.importnew.com/15712.html自

全面理解java自動裝箱(轉)

sam eva android 之間 對象類型 output 壓力 有一個 sla 自動裝箱和拆箱從Java 1.5開始引入,目的是將原始類型值轉自動地轉換成對應的對象。自動裝箱與拆箱的機制可以讓我們在Java的變量賦值或者是方法調用等情況下使用原始類型或者對象類型更

C# 裝箱

什麽 tel 強制 AS 引用類型 bsp 對象 過程 tex 什麽是裝箱和拆箱? 是值類型和對象之間進行轉換時,CLR必須執行裝箱和取消裝箱的過程。 裝箱 值類型 => 引用類型 int a = 1; object obj = a; Console.W

裝箱的性能損耗以及沒有裝箱的性能損耗

int color alt src 測試 tar con string mage List<int> listint = new List<int>(); DateTime start = DateTime.Now;

自動裝箱的幾個細節

是不是 返回 之間 println 實例 eof == 常開 equal 裝箱和拆箱 裝箱和拆箱也比較簡單,我就不解釋了,直接看代碼就行了。 Integer box = 2; // 自動裝箱 System.out.println(box); // 自動拆箱 雖然裝箱拆箱簡單

C#裝箱

net type tro nbsp 繼承 不一致 使用 sys 原因 C#裝箱和拆箱詳解 .net裝箱和拆箱是.net framework框架模型了值類型和引用類型之間的轉換發的過程, 值類型和引用類型之間可以轉換的原因是值類

c#的裝箱及值類型引用類型

int 什麽 容易 將在 shc 表達 需要 code 引用 裝箱:它允許根據值類型創建一個對象,然後使用對這新對象的一個引用。 int i = 5; object o = i; int j = (int)o; 裝箱:運行時將在堆上創建一個包含值5的對象(它是一個普通對象)

CLR via C#學習筆記-第五章-值類型的裝箱

總結 一行 other 對象的引用 返回對象 line 集合類 args math 5.3 值類型的裝箱和拆箱 裝箱 值類型比引用類型“輕”,原因是他們不作為對象在托管堆中分配,不被垃圾回收,也不通過指針進行引用。 但許多時候都需要獲取對值類型實例的引用。例如,假定要創建A

淺析Java自動裝箱

  最近在面試的時候,面試官提了一個很有趣的問題,如果這樣定義:   int a = 1; Integer b = 1;你覺得a ==b?還是怎麼樣?如果換成1000呢?   當時我沒有回答的出來,按照常規的思維,我覺得Integer是一個物件,int乃是基本的

Objective-C(裝箱)

概述  從前面的博文我們也可以看到,陣列和字典中只能儲存物件型別,其他基本型別和結構體是沒有辦法放到陣列和字典中的,當然你也是無法給它們傳送訊息的也就是說有些NSObject的方法是無法呼叫的,這個時候通常會用到裝箱boxing和拆箱unboxing。 其實各種高階語言基本上都有裝箱和拆 箱的過

Java基礎-----JDK1.5的新特性自動裝箱

JDK1.5的新特性 1、自動裝箱:把基本型別轉換為包裝類型別。 2、自動拆箱:把包裝類型別轉換為基本型別。 注意:在使用,Integer x = null;程式碼就會出現NullPointerException。 package StringBufferPac