程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> [Java開發之路](23)裝箱與拆箱

[Java開發之路](23)裝箱與拆箱

編輯:JAVA綜合教程

[Java開發之路](23)裝箱與拆箱


1. 簡介

大家對基本數據類型都非常熟悉,例如 int、float、double、boolean、char 等。基本數據類型是不具備對象的特性,比如基本類型不能調用方法、功能簡單。。。,為了讓基本數據類型也具備對象的特性, Java 為每個基本數據類型都提供了一個包裝類,這樣我們就可以像操作對象那樣來操作基本數據類型。

對象包裝類是不變的,即一旦構造了包裝類,就不允許更改包裝在其中的值。同時,對象包裝類還是final,因此不能定義它們的子類。

假設想定義一個整型數組列表,而尖括號中的類型參數不允許是基本類型的,也就是說,不允許寫成ArrayList。這裡用到了對象包裝類。我們可以聲明一個Integer對象的數組列表。


  1. ArrayList list = new ArrayList();

備注:

ArrayList的效率遠遠低於int[] 數組,但是還是使用ArrayList,其原因就是程序員操作的方便性比執行效率更加重要。

進行如下操作:


  1. list.add(3);

將自動轉換為:


  1. list.add(Integer.valueOf(3));

這種變換就是自動裝箱。

相反的,當將一個Integer對象賦予一個int值時,將會自動拆箱:


  1. int n = list.get(i)

將自動轉換為:


  1. int n = list.get(i).intValue();

備注:

裝箱與拆箱是編譯器認可的,而不是虛擬機。編譯器在生成類的字節碼時,插入必要的方法調用。虛擬機只是執行這些字節碼。

使用數值對象包裝類有一個好處:

可以將某些基本方法放置在包裝類中。


  1. int x = Integer.parseInt(s);
這裡與Integer對象一點關系也沒有,parseInt只是一個靜態方法,但是Integer類是放置這個方法的一個好去處。

2. 分類

裝箱:把基本類型轉換成包裝類,使其具有對象的性質,又可分為手動裝箱和自動裝箱


  1. package com.qunar.test;
  2.  
  3. public class HelloWorld {
  4. public static void main(String[] args) {
  5. // 定義一個int基本類型值
  6. int num = 14;
  7. // 手動裝箱
  8. Integer x = new Integer(num);
  9. // 自動裝箱
  10. Integer y = num;
  11. System.out.println("x->"+x+" y->"+y);
  12. }
  13. }

拆箱:和裝箱相反,把包裝類對象轉換成基本類型的值,又可分為手動拆箱和自動拆箱


  1. package com.qunar.test;
  2.  
  3. public class HelloWorld {
  4. public static void main(String[] args) {
  5. // 定義一個Integer包裝類
  6. Integer integer = new Integer(8);
  7. // 手動拆箱
  8. int x = integer.intValue();
  9. // 自動拆箱
  10. int y = integer;
  11. System.out.println("x->"+x+" y->"+y);
  12. }
  13. }

3. 分析

自動裝箱的弊端:

自動裝箱有一個問題,那就是在一個循環中進行自動裝箱操作的情況,如下面的例子就會創建多余的對象,影響程序的性能:


  1. Integer sum = 0;
  2. for(int i=1000; i<5000; i++){
  3. sum+=i;
  4. }

上面的代碼sum+=i可以看成sum = sum + i,但是+這個操作符不適用於Integer對象,首先sum進行自動拆箱操作,進行數值相加操作,最後發生自動裝箱操作轉換成Integer對象。其內部變化如下:


  1. sum = sum.intValue() + i;
  2. Integer sum = new Integer(result);

因此在我們編程時,需要注意到這一點,正確地聲明變量類型,避免因為自動裝箱引起的性能問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved