說到數據類型這個問題是一個基本的不能再基本的問題,我們當初編程入門第一課一般就是講數據類型,而今天我想記錄的是一個在Java中容易忽略的問題,即基本類型和包裝類型。
一、基本類型出現的原因
我們都知道在Java語言中,new一個對象存儲在堆里,我們通過堆棧中的引用來使用這些對象;但是對於經常用到的一系列類型如int,如果我們用new將其存儲在堆里就不是很有效——特別是簡單的小的變量。(如下圖所示為內存空間示意圖)
所以就出現了基本類型,同C++一樣,Java采用了相似的做法,對於這些類型不是用new關鍵字來創建,而是直接將變量的值存儲在堆棧中,因此更加高效。
Java共有9中基本類型,同別的語言有重要區別的是這9中類型所占存儲空間大小與機器硬件架構無關,這使得Java程序有很強的可移植性,如下圖:
二、包裝類型產生的原因
有了這9中基本類型,按理說應該夠用了啊,但是Java還提供了相應的包裝類型,如int對應Integer,char對應Character。為什么要有包裝類型?
是因為Java是一個面向對象的語言,基本類型並不具有對象的性質,為了與其他對象“接軌”就出現了包裝類型(如我們在使用集合類型Collection時就一定要使用包裝類型而非基本類型),它相當於將基本類型“包裝起來”,使得它具有了對象的性質,並且為其添加了屬性和方法,豐富了基本類型的操作。
這里大家可能會擔心一個問題,那豈不是我們在使用二者時要來回轉換?這點Java的自動包裝功能將會自動為我們完成,如下代碼顯示Character和char之間的相互轉換:
1 Character ch = new Character('x'); 2 char c = ch; 3 4 char c = 'c'; 5 Character ch = new Character(c);
三、包裝類型與基本類型異同
最后總結一下:
1.聲明方式不同,基本類型不適用new關鍵字,而包裝類型需要使用new關鍵字來在堆中分配存儲空間;
2.存儲方式及位置不同,基本類型是直接將變量值存儲在堆棧中,而包裝類型是將對象放在堆中,然后通過引用來使用;
3.初始值不同,基本類型的初始值如int為0,boolean為false,而包裝類型的初始值為null
4.使用方式不同,基本類型直接賦值直接使用就好,而包裝類型在集合如Collection、Map時會使用到