1. 程式人生 > >Java基本資料型別的大小,他們的封裝類以及自動拆箱和裝箱

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

Java提供了一套基本資料型別,總共有八種,也會有人說是有九種。

在我們的印象中,很多人可能會說出byte,short,int,long,float,double,boolean,char這八種資料型別。

那麼還有一種是哪種呢,它到底是不是資料型別呢?

我們很容易忽略一個void,有人說void也是資料型別之一,也有人說不是。

在Java的API中,並未說明void是基本資料型別,那為什麼Java聖經“Think in Java”還有一些書籍會說void是一種基本資料型別呢?

眾所周知,Java的資料型別分兩種,一種是基本資料型別,一種是引用型別。兩者的本質區別是:基本型別是在堆疊處分配空間存“值”,但是引用型別,是在堆裡面分配空間存“值”。Void是不能new出來的,也就是不能在堆裡面分配空間存值,那就是一開始就在堆疊處分配好空間了。所以,將void歸於基本資料型別,也有道理。

所以加上前面八種資料型別,java總共為我們提供了九種資料型別。

下面我引用了rabbit_in_android文章中的一個表格來介紹一下九種資料結構的大小,預設值和封裝類。

基本型別 大小(位元組) 預設值 封裝類
byte 1 (byte)0 Byte
short 2 (short)0 Short
int 4 0 Integer
long
8 0L Long
float 4 0.0f Float
double 8 0.0d Double
boolean - false Boolean
char 2 \u0000(null) Character
void - - Void










那麼為什麼Java又會有基本型別的封裝類呢,為什麼要這樣做?

用基本資料型別的好處是:在java中使用基本型別來儲存語言支援的基本資料型別,這裡沒有采用物件,而是使用了傳統的面向過程語言所採用的基本型別,主要是從效能方面來考慮的:因為即使最簡單的數學計算,使用物件來處理也會引起一些開銷,而這些開銷對於數學計算本來是毫無必要的。

封裝類:在java中,泛型類包括預定義的集合,使用的引數都是物件型別,無法直接使用這些基本資料型別,所以java又提供了這些基本型別的包裝器。如List<Integer>是一個整形的List集合,不能這樣子寫List<int>。


自動裝箱:當我們建立一個Integer物件的時候,可以這樣

Integer i = 100;
//注意,不是i = 100
實際上,執行上面那句程式碼的時候,jvm自動為我們執行了:

Integer i = Integer.valueOf(100);
這就是將基本資料型別裝箱成為它們的封裝類型別。


自動拆箱:就是將物件中的基本資料從物件中自動取出,如下:

Integer i = 100;     //自動裝箱
int x = i;      //自動拆箱
實際上,拆箱操作就是自動執行了int x = i.intValue();

基本資料型別和封裝類的一些區別:
  • 1.基本資料型別只能按值傳遞,而封裝類按引用傳遞。
  • 2.基本型別在堆疊中建立;而物件型別在堆中建立,物件的引用在堆疊中建立。基本型別由於在堆疊中,效率會比較高,但是可能會存在記憶體洩漏的問題。
  • 3.int型別的預設值是0,而Integer的預設值是null。

附加上一些知識點:
//在-128~127 之外的數
 Integer i1 =200;  
 Integer i2 =200;          
 System.out.println("i1==i2: "+(i1==i2));                   
 // 在-128~127 之內的數
 Integer i3 =100;  
 Integer i4 =100;  
 System.out.println("i3==i4: "+(i3==i4));
輸出的結果是:
  i1==i2: false
  i3==i4: true
說明:“==”是用來比較兩個物件的引用(記憶體地址)是否相同,也用來比較兩個基本資料型別的變數值是否相等。 int 的自動裝箱,是系統執行了 Integer.valueOf(int i),來看看valueOf方法原始碼:
public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)  // 沒有設定的話,IngegerCache.high 預設是127
        return IntegerCache.cache[i + 128];      //返回的是快取的Integer物件
    else
        return new Integer(i);
}
對於-128到127(預設是127)之間的值,Integer.valueOf(int i)返回的是快取的Integer物件(並不是新建立一個物件)。 而範圍外的其它值,執行Integer.valueOf(int i)返回的是一個新建立的Integer物件。 所以對於上面例子的 i1 和 i2 ,它們是新建立的Integer物件,所以會返回false,而 i3 和 i4 是指向同一個快取的Integer物件,所以返回true。

當然,當不使用自動裝箱功能的時候,情況與普通類物件一樣。如下:

Integer i3 =new Integer(100); 
Integer i4 =new Integer(100); 
System.out.println("i3==i4: "+(i3==i4));//顯示false

參考:

http://write.blog.csdn.net/postedit

http://blog.csdn.net/rabbit_in_android/article/details/49793813

http://blog.csdn.net/syc434432458/article/details/49964089