基本數據的自動拆裝箱及享元模式

基本數據的自動拆裝箱

大家都知道,Java的精髓是一切皆對象。Java繼承了一般設計語言的基本數據類型(如int、double等),這種基本數據類型不是對象,而在使用中需要把基本類型轉換成對象進行使用。比如使用Map集合對象的Put( )方法時,需要傳入的參數是對象。所以,使用在編譯時自動將基本數據類型打包成對應的對象,既能符合Java面向對象的設計原則,又能不影響人們使用基本數據類型的習慣。我們把基本數據類型與對象之間的自動轉化稱爲自動拆、裝箱。

自動裝箱:把類型轉變爲引用類型

自動拆箱引用類型轉變爲值類型

在J2SE 5.0之前,對基本數據類型進行打包,需要顯示轉化。例如:

[java] view plain copy
  1. Integer integer=new Integer(10);  

在J2SE 5.0之後提供了自動裝箱(AutoBoxing)和自動拆箱(UnBoxing)的功能,可以將上面的代碼直接寫成:
[java] view plain copy
  1. Integer integer=10;  
實際上,這是編譯器在編譯代碼的時候進行了自動轉化。帶來方便之於隱匿了細節。

[java] view plain copy
  1. public class AutoBoxDemo{  
  2.   
  3.     public static void main(String[] args) {  
  4.   
  5.         Integer i1 = 100;  
  6.   
  7.         Integer i2 = 100;  
  8.   
  9.         if (i1 == i2)  
  10.   
  11.             System.out.println("i1 == i2");  
  12.   
  13.         else  
  14.   
  15.             System.out.println("i1 != i2");  
  16.   
  17.         Integer i3 = 200;  
  18.   
  19.         Integer i4 = 200;  
  20.   
  21.         if (i3 == i4)  
  22.   
  23.             System.out.println("i3 == i4");  
  24.   
  25.         else  
  26.   
  27.             System.out.println("i3 != i4");  
  28.   
  29.     }  
  30.   
  31. }  
結果是:

true

false

爲什麼i3==i4是false呢?
在自動裝箱時對於值從-128到127之間的值,它們被裝箱爲Integer對象後,會存在內存中被重用,所以AutoBoxDemo中使用==進行比較時,i1與i2實際上參考至同一個對象.如果超過了從-128到127之間的值,被裝箱後的Integer對象並不會被重用,即相當於每次裝箱時都新建一個Integer對象,所以AutoBoxDemo中使用==繼續比較時,i3與i4參考的是不同的對象.

這裏就牽扯一個設計模式,叫享元設計模式(Flywight)

享元設計模式的特點是:複製內存中已存在的對象,降低系統創建對象實例的內存。比如,此處-128-127之間的值經常被使用,就不需要創建新的對象了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章