App下載

Java基本數(shù)據(jù)類(lèi)型,看這一篇就夠了!

猿友 2021-01-11 17:30:47 瀏覽數(shù) (3215)
反饋

相信學(xué)過(guò)Java的小伙伴們都知道,Java是強(qiáng)類(lèi)型語(yǔ)言,所以Java對(duì)于數(shù)據(jù)類(lèi)型的規(guī)范會(huì)相對(duì)嚴(yán)格。

它提供了八種基本類(lèi)型(這里不講解Void)。其中六種數(shù)字類(lèi)型(四個(gè)整數(shù)型(默認(rèn)是int 型),兩個(gè)浮點(diǎn)型(默認(rèn)是double 型)),一種字符類(lèi)型,還有一種布爾型。

基礎(chǔ)

我們先來(lái)一點(diǎn)干貨??!

基本數(shù)據(jù)類(lèi)型大小值域默認(rèn)值包裝器類(lèi)型
boolean-true,falsefalseBoolean
char16 bit[0,216-1]‘\u0000’Character
byte8 bit[-128,127]0Byte
short16 bit[-215,215-1]0Short
int32 bit[-231,231-1]0Integer
long64 bit[-263,263-1]0LLong
float32 bit[-3.4E38,3.4E38]0.0FFloat
double64 bit[-1.8E308,1.8E308]0.0DDouble

如果掌握了這些要點(diǎn),那說(shuō)明基礎(chǔ)是不錯(cuò)的,有興趣的話可以隨小編再深入了解一下??!

深入

數(shù)據(jù)類(lèi)型在計(jì)算機(jī)語(yǔ)言里面,是對(duì)程序所處理數(shù)據(jù)的抽象,它存在的意義是為了方便虛擬機(jī)為不同的數(shù)據(jù)分配更合適的空間。所以,對(duì)數(shù)據(jù)類(lèi)型的理解自然與虛擬機(jī)分不開(kāi)。

在 Java 虛擬機(jī)規(guī)范中,boolean 類(lèi)型則被映射成 int 類(lèi)型。具體來(lái)說(shuō),“true”被映射為整數(shù) 1,而“false”被映射為整數(shù) 0。這個(gè)編碼規(guī)則約束了 Java 字節(jié)碼的具體實(shí)現(xiàn)。

Java 虛擬機(jī)規(guī)范同時(shí)也要求 Java 編譯器遵守這個(gè)編碼規(guī)則,并且用整數(shù)相關(guān)的字節(jié)碼來(lái)實(shí)現(xiàn)邏輯運(yùn)算,以及基于 boolean 類(lèi)型的條件跳轉(zhuǎn)。這樣一來(lái),在編譯而成的 class 文件中,除了字段和傳入?yún)?shù)外,基本看不出 boolean 類(lèi)型的痕跡了。

Java 的基本類(lèi)型都有對(duì)應(yīng)的值域和默認(rèn)值。

可以看到,byte、short、int、long、float 以及 double 的值域依次擴(kuò)大,而且前面的值域被后面的值域所包含。因此,從前面的基本類(lèi)型轉(zhuǎn)換至后面的基本類(lèi)型,無(wú)需強(qiáng)制轉(zhuǎn)換。另外一點(diǎn)值得注意的是,盡管他們的默認(rèn)值看起來(lái)不一樣,但在內(nèi)存中都是 0。

在這些基本類(lèi)型中,boolean 和 char 是唯二的無(wú)符號(hào)類(lèi)型。boolean 類(lèi)型的取值范圍是 0 或者 1,char 類(lèi)型的取值范圍則是 [0, 65535]。通常我們可以認(rèn)定 char 類(lèi)型的值為非負(fù)數(shù),這種特性十分有用,比如說(shuō)作為數(shù)組索引等。

數(shù)據(jù)存儲(chǔ)

Java 虛擬機(jī)每調(diào)用一個(gè) Java 方法,便會(huì)創(chuàng)建一個(gè)棧幀。這種棧幀有兩個(gè)主要的組成部分,分別是局部變量區(qū),以及字節(jié)碼的操作數(shù)棧。

在 Java 虛擬機(jī)規(guī)范中,局部變量區(qū)等價(jià)于一個(gè)數(shù)組,并且可以用正整數(shù)作為索引。除了 long、double 值需要用兩個(gè)數(shù)組單元來(lái)存儲(chǔ)之外,其他基本類(lèi)型以及引用類(lèi)型的值均占用一個(gè)數(shù)組單元。也就是說(shuō),boolean、byte、char、short 這四種類(lèi)型,在棧上占用的空間和 int 是一樣的,和引用類(lèi)型也是一樣的。

因此,當(dāng)我們將一個(gè) int 類(lèi)型的值,存儲(chǔ)到這些類(lèi)型的字段或數(shù)組時(shí),相當(dāng)于做了一次隱式的掩碼操作。舉例來(lái)說(shuō),當(dāng)我們把 0xFFFFFFFF(-1)存儲(chǔ)到一個(gè)聲明為 char 類(lèi)型的字段里時(shí),由于該字段僅占兩字節(jié),所以高兩位的字節(jié)便會(huì)被截取掉,最終存入“\uFFFF”。

數(shù)據(jù)加載

Java 虛擬機(jī)的算數(shù)運(yùn)算幾乎全部依賴(lài)于操作數(shù)棧。也就是說(shuō),我們需要將堆中的 boolean、byte、char 以及 short 加載到操作數(shù)棧上,而后將棧上的值當(dāng)成 int 類(lèi)型來(lái)運(yùn)算。

對(duì)于 boolean、char 這兩個(gè)無(wú)符號(hào)類(lèi)型來(lái)說(shuō),加載伴隨著零擴(kuò)展。舉例來(lái)說(shuō),char 的大小為兩個(gè)字節(jié),在加載時(shí) char 的值會(huì)被復(fù)制到 int 類(lèi)型的低二字節(jié),而高二字節(jié)則會(huì)用 0 來(lái)填充。

對(duì)于 byte、short 這兩個(gè)類(lèi)型來(lái)說(shuō),加載伴隨著符號(hào)擴(kuò)展。舉個(gè)例子,short 的大小為兩個(gè)字節(jié)。在加載時(shí) short 的值同樣會(huì)被復(fù)制到 int 類(lèi)型的低二字節(jié)。如果該 short 值為非負(fù)數(shù),即最高位為 0,那么該 int 類(lèi)型的值的高二字節(jié)會(huì)用 0 來(lái)填充,否則用 1 來(lái)填充。

小結(jié)

基礎(chǔ)知識(shí)要掌握好,底層實(shí)現(xiàn)也需要有一定的認(rèn)識(shí)。了解虛擬機(jī),有助于理解Java語(yǔ)言的一些性質(zhì),也有助于使用Java語(yǔ)言。

推薦閱讀:

Java:23天零基礎(chǔ)完全入門(mén)

深入解析Java面向?qū)ο?/a>

Java8編程開(kāi)發(fā)入門(mén)


0 人點(diǎn)贊