基本數據的自動拆裝箱
大家都知道,Java的精髓是一切皆對象。Java繼承了一般設計語言的基本數據類型(如int、double等),這種基本數據類型不是對象,而在使用中需要把基本類型轉換成對象進行使用。比如使用Map集合對象的Put( )方法時,需要傳入的參數是對象。所以,使用在編譯時自動將基本數據類型打包成對應的對象,既能符合Java面向對象的設計原則,又能不影響人們使用基本數據類型的習慣。我們把基本數據類型與對象之間的自動轉化稱爲自動拆、裝箱。
自動裝箱:把值類型轉變爲引用類型
自動拆箱:把引用類型轉變爲值類型
在J2SE 5.0之前,對基本數據類型進行打包,需要顯示轉化。例如:
- Integer integer=new Integer(10);
在J2SE 5.0之後提供了自動裝箱(AutoBoxing)和自動拆箱(UnBoxing)的功能,可以將上面的代碼直接寫成:
- Integer integer=10;
- public class AutoBoxDemo{
- public static void main(String[] args) {
- Integer i1 = 100;
- Integer i2 = 100;
- if (i1 == i2)
- System.out.println("i1 == i2");
- else
- System.out.println("i1 != i2");
- Integer i3 = 200;
- Integer i4 = 200;
- if (i3 == i4)
- System.out.println("i3 == i4");
- else
- System.out.println("i3 != i4");
- }
- }
true
false
爲什麼i3==i4是false呢?
在自動裝箱時對於值從-128到127之間的值,它們被裝箱爲Integer對象後,會存在內存中被重用,所以AutoBoxDemo中使用==進行比較時,i1與i2實際上參考至同一個對象.如果超過了從-128到127之間的值,被裝箱後的Integer對象並不會被重用,即相當於每次裝箱時都新建一個Integer對象,所以AutoBoxDemo中使用==繼續比較時,i3與i4參考的是不同的對象.
這裏就牽扯一個設計模式,叫享元設計模式(Flywight)。
享元設計模式的特點是:複製內存中已存在的對象,降低系統創建對象實例的內存。比如,此處-128-127之間的值經常被使用,就不需要創建新的對象了。