1. 程式人生 > >java中的拆箱與裝箱

java中的拆箱與裝箱

如果你在Java1.5下進行過程式設計的話,你一定不會陌生這一點,你不能直接地向集合(Collections)中放入原始型別值,因為集合只接收物件。通常這種情況下你的做法是,將這些原始型別的值轉換成物件,然後將這些轉換的物件放入集合中。使用Integer,Double,Boolean等這些類我們可以將原始型別值轉換成對應的物件,但是從某些程度可能使得程式碼不是那麼簡潔精煉。為了讓程式碼簡練,Java 1.5引入了具有在原始型別和物件型別自動轉換的裝箱和拆箱機制。但是自動裝箱和拆箱並非完美,在使用時需要有一些注意事項,如果沒有搞明白自動裝箱和拆箱,可能會引起難以察覺的bug。


     由圖可以看出,當宣告Long型別用數字時我們要強轉,但是Long轉long是自動的,我們可以宣告Long為null,但是long不行,由此可見包裝類是引用資料型別,如果不注意這點就會犯錯。

     比如說當我們service層的getById(long id)呼叫dao層的getById(Long id),我們在dao層做了不為null的判斷,但是當傳過來的資料為null(action-->service)時會報空指標異常,因為long不能接收null型別的資料。

本文將介紹,什麼是自動裝箱和拆箱,自動裝箱和拆箱發生在什麼時候,以及要注意的事項。

什麼是自動裝箱和拆箱

自動裝箱就是Java自動將原始型別值轉換成對應的物件,比如將int的變數轉換成Integer物件,這個過程叫做裝箱,反之將Integer物件轉換成int型別值,這個過程叫做拆箱。因為這裡的裝箱和拆箱是自動進行的非人為轉換,所以就稱作為自動裝箱和拆箱。原始型別byte,short,char,int,long,float,double和boolean對應的封裝類為Byte,Short,Character,Integer,Long,Float,Double,Boolean。

自動裝箱拆箱要點

  • 自動裝箱時編譯器呼叫valueOf將原始型別值轉換成物件,同時自動拆箱時,編譯器通過呼叫類似intValue(),doubleValue()這類的方法將物件轉換成原始型別值。
  • 自動裝箱是將boolean值轉換成Boolean物件,byte值轉換成Byte物件,char轉換成Character物件,float值轉換成Float物件,int轉換成Integer,long轉換成Long,short轉換成Short,自動拆箱則是相反的操作。

何時發生自動裝箱和拆箱

自動裝箱和拆箱在Java中很常見,比如我們有一個方法,接受一個物件型別的引數,如果我們傳遞一個原始型別值,那麼Java會自動講這個原始型別值轉換成與之對應的物件。最經典的一個場景就是當我們向ArrayList這樣的容器中增加原始型別資料時或者是建立一個引數化的類,比如下面的ThreadLocal。

1 2 3 4 5 6 7 8 9 ArrayList<Integer> intList = new ArrayList<Integer>(); intList.add(1); //autoboxing - primitive to object intList.add(2); //autoboxing ThreadLocal<Integer> intLocal = new ThreadLocal<Integer>(); intLocal.set(4); //autoboxing int number = intList.get(0); // unboxing int local = intLocal.get(); // unboxing in Java

舉例說明

上面的部分我們介紹了自動裝箱和拆箱以及它們何時發生,我們知道了自動裝箱主要發生在兩種情況,一種是賦值時,另一種是在方法呼叫的時候。為了更好地理解這兩種情況,我們舉例進行說明。

賦值時

這是最常見的一種情況,在Java 1.5以前我們需要手動地進行轉換才行,而現在所有的轉換都是由編譯器來完成。

1 2 3 4 5 6 7 //before autoboxing Integer iObject = Integer.valueOf(3); Int iPrimitive = iObject.intValue() //after java5 Integer iObject = 3; //autobxing - primitive to wrapper conversion int iPrimitive = iObject; //unboxing - object to primitive conversion

方法呼叫時

這是另一個常用的情況,當我們在方法呼叫時,我們可以傳入原始資料值或者物件,同樣編譯器會幫我們進行轉換。

1 2 3 4 5 6 7

相關推薦

java裝箱

如果你在Java1.5下進行過程式設計的話,你一定不會陌生這一點,你不能直接地向集合(Collections)中放入原始型別值,因為集合只接收物件。通常這種情況下你的做法是,將這些原始型別的值轉換成物件,然後將這些轉換的物件放入集合中。使用Integer,Double

JAVA】談談裝箱

                                          談

C# 裝箱

 public void BoxUnbox()         {             int i = 123;             int a = 2;             int j = a;             int mm = a + j;      

Java裝箱

在Java SE5之前,如果要生成一個數值為10 的Interger物件,必須這樣進行: Interger i = new Interger(10); Java SE5之後,如果要生成一個數值為10的Interger物件,只需要這樣就可以: Interger i = 1

Java裝箱

基本數據 JD 基本數據類型 AS val 類型 sys 裝箱 數據 一.拆箱和裝箱的概念   裝箱:將基本數據類型的值轉為引用類型的值;   拆箱:將引用類型的值轉換為基本數據類型的值; 二.實例演示 public class Example19 { public

java的自動裝箱是指什麼?

JAVA語言中有個名詞叫自動拆箱、裝箱,那這個自動拆箱、裝箱到底是指啥? 自動拆箱、裝箱是從JDK1.5開始才有的特性,其實它主要就是指基本型別與包裝類的自動轉換。 如int 與Integer型別。 int 是基本型別,而Integer是int的包裝類,在

Java學習筆記 (十五) 自動自動裝箱

什麼是自動拆裝箱 自動裝箱: 就是將基本資料型別自動轉換成對應的包裝類. 自動拆箱:就是將包裝類自動轉換成對應的基本資料型別。 For example : Integer a=1; //自動裝箱 int b=a; //自動拆

Java什麼是自動裝箱,什麼是自動

  一、自動裝箱      假設想定義一個整形陣列列表。而尖括號中的型別引數不允許是基本型別,也就是說,不允許寫成ArrayList<int>。這裡就用到了Integer物件包裝器類。我們可以宣告一個Integer物件的陣列列表。 ArrayList<

java裝箱

手工 enc bsp 簡潔 實現 lan 開始 spa 徹底 1.自動裝箱和自動拆箱 - 指的是原始類型和封裝類型相互轉換。 2. 為什麽要擁有裝箱和拆箱機制? - 使java代碼更加徹底地面向對象 - 從jdk1.5以後開始支持,使代碼更加簡潔,

Java基本資料型別的大小,他們的封裝類以及自動裝箱

Java提供了一套基本資料型別,總共有八種,也會有人說是有九種。 在我們的印象中,很多人可能會說出byte,short,int,long,float,double,boolean,char這八種資料型別。 那麼還有一種是哪種呢,它到底是不是資料型別呢? 我們很容易忽略一個void,有

java 1.5 自動裝箱的注意事項

背景 java1.5後引入了自動裝箱和自動拆箱的概念 自動拆箱:將引用型別轉化為基本資料型別 自動裝箱:將基本資料型別裝為引用型別 但是實際使用中,什麼情況自動拆箱什麼情況自動裝箱呢? 自動裝箱 Integer i = 100; (呼叫Integer.valueOf(100)) 這裡存

6個關於Java包裝類裝箱的判斷題,你能做對幾個?

雖然 Java 語言是典型的面向物件程式語言,但其中的八種基本資料型別並不支援面向物件程式設計,基本型別的資料不具備“物件”的特性——不攜帶屬性、沒有方法可呼叫。為此,Java為每種基本資料型別分別設計了對應的類,稱之為包裝類(Wrapper Classes)。 裝箱(Box

JAVA自動裝箱以及裝箱時的快取問題

概述 JAVA中的自動裝箱指的是把基本型別的值轉換為對應的包裝類物件,自動拆箱則相反。 JAVA中的基本型別: boolean/1, byte/8, char/16, short/16, int/32, long/64,float/32, double/64 基本型別都

Java學習筆記(六)--包裝類、基本型別、裝箱

基本型別與包裝類        1.java中包括8個基本型別,與之對應的有8個包裝型別,包裝類是針對原生資料型別的包裝                       基本型別                          包裝型別byteByte(Number的子類)sh

java裝箱詳解(轉)

需要注意的是:當 "=="運算子的兩個運算元都是 包裝器型別的引用,則是比較指向的是否是同一個物件,而如果其中有一個運算元是表示式(即包含算術運算)則比較的是數值(即會觸發自動拆箱的過程)。另外,對於包裝器型別,equals方法並不會進行型別轉換。   自動裝箱和拆箱問題是Java

Integer自動自動裝箱的注意事項

java虛擬機器非常的智慧,能自動的幫助我們自動裝箱與拆箱。雖然它自動幫我們處理這些事情很是方便,但是並不是總是這樣的。有時候或許我們就會因為忽略掉這些小細節而給我們的程式留下一些bug。下面我們就來

Java字節對象之間的轉換

ring str arr cti void too trac port ear 近期公司裏面用到了消息隊列,而正如我們知道的是消息隊列之間的是通過二進制形式的。以下就分享一下java中字節與對象之間的轉換。 主要是用到了ByteArrayOutputStream和Ob

java的類對象

共享 泛化 不能 變量聲明 eas diag 特征 類變量 set 面向對象編程主要有三個特征:封裝、繼承和多態。 封裝 一個簡單的問題 一個能輸出圓的面積的Java應用程序。 public class ComputerCircleArea

javapublic voidpublic static void區別

sta erro ati 對象 方法 這樣的 調用 必須 靜態方法 static 方法可以被main方法直接調用,而非static方法不可以。因為static方法是屬於類的,是類方法。可以通過類名.方法名直接調用。而非static方法必須等對象被new出來以後才能使用,因而

Java重載重寫的區別

ref 類對象 就是 不同 3.4 做出 同方 相同 默認 簡單的個人記憶,重寫是子類中的方法與父類的方法參數、返回值一模一樣,重載是對於同一個類中的方法,方法名相同,參數類型、個數不同。當父類的引用指向子類對象的時候,子類中如果有對於父類方法的重寫,則調用的是子類重寫過的