相信學過Java的小伙伴們都知道,Java是強類型語言,所以Java對于數(shù)據(jù)類型的規(guī)范會相對嚴格。
它提供了八種基本類型(這里不講解Void)。其中六種數(shù)字類型(四個整數(shù)型(默認是int 型),兩個浮點型(默認是double 型)),一種字符類型,還有一種布爾型。
基礎(chǔ)
我們先來一點干貨??!
基本數(shù)據(jù)類型 | 大小 | 值域 | 默認值 | 包裝器類型 |
---|---|---|---|---|
boolean | - | true,false | false | Boolean |
char | 16 bit | [0,216-1] | ‘\u0000’ | Character |
byte | 8 bit | [-128,127] | 0 | Byte |
short | 16 bit | [-215,215-1] | 0 | Short |
int | 32 bit | [-231,231-1] | 0 | Integer |
long | 64 bit | [-263,263-1] | 0L | Long |
float | 32 bit | [-3.4E38,3.4E38] | 0.0F | Float |
double | 64 bit | [-1.8E308,1.8E308] | 0.0D | Double |
如果掌握了這些要點,那說明基礎(chǔ)是不錯的,有興趣的話可以隨小編再深入了解一下??!
深入
數(shù)據(jù)類型在計算機語言里面,是對程序所處理數(shù)據(jù)的抽象,它存在的意義是為了方便虛擬機為不同的數(shù)據(jù)分配更合適的空間。所以,對數(shù)據(jù)類型的理解自然與虛擬機分不開。
在 Java 虛擬機規(guī)范中,boolean 類型則被映射成 int 類型。具體來說,“true”被映射為整數(shù) 1,而“false”被映射為整數(shù) 0。這個編碼規(guī)則約束了 Java 字節(jié)碼的具體實現(xiàn)。
Java 虛擬機規(guī)范同時也要求 Java 編譯器遵守這個編碼規(guī)則,并且用整數(shù)相關(guān)的字節(jié)碼來實現(xiàn)邏輯運算,以及基于 boolean 類型的條件跳轉(zhuǎn)。這樣一來,在編譯而成的 class 文件中,除了字段和傳入?yún)?shù)外,基本看不出 boolean 類型的痕跡了。
Java 的基本類型都有對應(yīng)的值域和默認值。
可以看到,byte、short、int、long、float 以及 double 的值域依次擴大,而且前面的值域被后面的值域所包含。因此,從前面的基本類型轉(zhuǎn)換至后面的基本類型,無需強制轉(zhuǎn)換。另外一點值得注意的是,盡管他們的默認值看起來不一樣,但在內(nèi)存中都是 0。
在這些基本類型中,boolean 和 char 是唯二的無符號類型。boolean 類型的取值范圍是 0 或者 1,char 類型的取值范圍則是 [0, 65535]。通常我們可以認定 char 類型的值為非負數(shù),這種特性十分有用,比如說作為數(shù)組索引等。
數(shù)據(jù)存儲
Java 虛擬機每調(diào)用一個 Java 方法,便會創(chuàng)建一個棧幀。這種棧幀有兩個主要的組成部分,分別是局部變量區(qū),以及字節(jié)碼的操作數(shù)棧。
在 Java 虛擬機規(guī)范中,局部變量區(qū)等價于一個數(shù)組,并且可以用正整數(shù)作為索引。除了 long、double 值需要用兩個數(shù)組單元來存儲之外,其他基本類型以及引用類型的值均占用一個數(shù)組單元。也就是說,boolean、byte、char、short 這四種類型,在棧上占用的空間和 int 是一樣的,和引用類型也是一樣的。
因此,當我們將一個 int 類型的值,存儲到這些類型的字段或數(shù)組時,相當于做了一次隱式的掩碼操作。舉例來說,當我們把 0xFFFFFFFF(-1)存儲到一個聲明為 char 類型的字段里時,由于該字段僅占兩字節(jié),所以高兩位的字節(jié)便會被截取掉,最終存入“\uFFFF”。
數(shù)據(jù)加載
Java 虛擬機的算數(shù)運算幾乎全部依賴于操作數(shù)棧。也就是說,我們需要將堆中的 boolean、byte、char 以及 short 加載到操作數(shù)棧上,而后將棧上的值當成 int 類型來運算。
對于 boolean、char 這兩個無符號類型來說,加載伴隨著零擴展。舉例來說,char 的大小為兩個字節(jié),在加載時 char 的值會被復制到 int 類型的低二字節(jié),而高二字節(jié)則會用 0 來填充。
對于 byte、short 這兩個類型來說,加載伴隨著符號擴展。舉個例子,short 的大小為兩個字節(jié)。在加載時 short 的值同樣會被復制到 int 類型的低二字節(jié)。如果該 short 值為非負數(shù),即最高位為 0,那么該 int 類型的值的高二字節(jié)會用 0 來填充,否則用 1 來填充。
小結(jié)
基礎(chǔ)知識要掌握好,底層實現(xiàn)也需要有一定的認識。了解虛擬機,有助于理解Java語言的一些性質(zhì),也有助于使用Java語言。
推薦閱讀: