Java 語(yǔ)言支持的類型分為兩類:
基本數(shù)據(jù)類型(Primitive Type)和引用類型(Reference Type)。
基本數(shù)據(jù)類型
數(shù)值類型
整數(shù)類型
byte
一個(gè) byte 類型在內(nèi)存中占 8 位(1字節(jié))范圍-128(-2^7) ~ 127(2^7 -1)
short
一個(gè) short 類型在內(nèi)存中占 16 位(2字節(jié))范圍-32768(-2^15) ~ 32767(2^15-1)
int
一個(gè) int 類型在內(nèi)存占 32 位(4字節(jié))范圍-2147483648(-2^31) ~ 2147483647(2^31-1)
long
一個(gè) long 類型在內(nèi)存中占 64 位(8 字節(jié))范圍-2^63 ~ 2^63-1
如果直接將一個(gè)較小的整數(shù)值(在
byte或者short類型的范圍內(nèi))賦給一個(gè)byte或者short的變量,系統(tǒng)會(huì)自動(dòng)把這個(gè)整數(shù)值當(dāng)成byte或者short類型來(lái)處理.
如果使用一個(gè)巨大的整數(shù)值(超出 int 類型的范圍)時(shí),Java 不會(huì)自動(dòng)把這個(gè)整數(shù)值當(dāng)成 long 類型來(lái)處理。如果希望系統(tǒng)把一個(gè)整數(shù)值當(dāng)成 long 類型來(lái)處理,應(yīng)在這個(gè)整數(shù)值后增加l或者L做后綴。
浮點(diǎn)類型
Java 的浮點(diǎn)類型有固定的表數(shù)范圍和字段長(zhǎng)度,字段長(zhǎng)度和表數(shù)范圍與機(jī)器無(wú)關(guān),Java 的浮點(diǎn)類型遵循 IEEE 標(biāo)準(zhǔn),采用二進(jìn)制的科學(xué)計(jì)數(shù)法來(lái)表示。
float
一個(gè) float 類型在內(nèi)存中占 4 字節(jié),32 位,第 1 位是符號(hào)位,接下來(lái)的 8 位表示指數(shù),在接下來(lái)的 23 位表示位數(shù)。
double
一個(gè) double 類型在內(nèi)存中占 8 字節(jié),64 位,第 1 位表示符號(hào)位,接下來(lái)的 11 位表示指數(shù),在接下來(lái)的 52 位表示尾數(shù)。
因?yàn)?Java 浮點(diǎn)數(shù)是用二進(jìn)制的科學(xué)計(jì)數(shù)法來(lái)表示浮點(diǎn)數(shù),因此可能不能精確表示一個(gè)浮點(diǎn)數(shù)。例如把
5.12345f賦值給一個(gè)float類型的變量,接著輸出這個(gè)變量時(shí)看到這個(gè)變量的值已經(jīng)發(fā)生了改變。 如果需要一個(gè)精確的浮點(diǎn)數(shù),可以使用BigDecimal類。
浮點(diǎn)類型默認(rèn)的是double如果希望Java把一個(gè)浮點(diǎn)類型值當(dāng)成float來(lái)處理,應(yīng)當(dāng)在這個(gè)浮點(diǎn)類型值后面緊跟一個(gè)f或者F。
Java 還提供了三個(gè)特殊的浮點(diǎn)數(shù)值:正無(wú)窮大,負(fù)無(wú)窮大和非數(shù),用于表示溢出或者出錯(cuò)。正浮點(diǎn)數(shù)除以 0(Java會(huì)自動(dòng)把和浮點(diǎn)數(shù)進(jìn)行運(yùn)算的整數(shù) 0 當(dāng)成浮點(diǎn)數(shù) 0.0 處理)得到正無(wú)窮大(Double/Float 類中的 POSITIVE_INFINITY).使用一個(gè)負(fù)浮點(diǎn)數(shù)除以 0 得到負(fù)無(wú)窮大(Double/Float 類中的 NEGATIVE_INFINITY)
表示。0.0/0.0 將得到一個(gè)非數(shù) NaN.
所有的正無(wú)窮大以及負(fù)無(wú)窮大都相等,所有的非數(shù)都不相等。
100_000_000_000數(shù)值中的_方便閱讀。無(wú)實(shí)際含義。

字符型
char
字符型有三種表示形式
- 直接通過(guò)單個(gè)字符來(lái)指定字符型值,例如
'A'、'9'和'0'等. - 通過(guò)轉(zhuǎn)移字符標(biāo)識(shí)特殊字符型值,例如
'\n'、'\t' - 直接使用
Unicode值來(lái)表示字符型值,格式是'\uXXXX',其中XXXX代表 一個(gè)十六進(jìn)制的整數(shù)。

字符類型也可以使用十六進(jìn)制編碼方式來(lái)表示,范圍是'\u0000'~'\uFFFF',一共可以表示 65535 個(gè)字符,其中前 256 個(gè)('\u0000'~'\u00FF')字符和 ASCII 碼中的字符完全重合。
計(jì)算機(jī)底層保存字符時(shí),實(shí)際上保存的是該字符對(duì)應(yīng)的編號(hào),因此 char 類型的值可以直接作為整形使用,它相當(dāng)于一個(gè) 16 位的無(wú)符號(hào)整數(shù),表數(shù)范圍是 0~65535.
如果把 0~65535 范圍內(nèi)的一個(gè) int 整數(shù)賦給 char 類型變量,系統(tǒng)自動(dòng)會(huì)把這個(gè) int 整數(shù)當(dāng)成 char 類型來(lái)處理
布爾類型
boolean
用于表示邏輯上的真或假, boolean類型的數(shù)值只能是 true 或者 false, 不能用 0 或者非0 來(lái)表示,其他基本數(shù)據(jù)類型也不能轉(zhuǎn)換成 boolean 類型。
Java 規(guī)范沒有強(qiáng)制指定 boolean 類型的變量所占用的內(nèi)存空間。由于大部分計(jì)算機(jī)在內(nèi)存分配時(shí)允許的最小內(nèi)存單元是字節(jié)(8 位),因此 bit 大部分時(shí)候?qū)嶋H占用 8 位。
Java虛擬機(jī)規(guī)范一書提到 :
- 在Java虛擬機(jī)中沒有任何供 boolean值專用的字節(jié)碼指令,Java語(yǔ)言表達(dá)式所操作的
boolean值,在編譯之后都使用Java虛擬機(jī)中的int數(shù)據(jù)類型來(lái)代替。- Java虛擬機(jī)直接支持 boolean類型的數(shù)組,虛擬機(jī)的 navarra指令參見第6章的newarray小節(jié)可以創(chuàng)建這種數(shù)組。boolean類型數(shù)組的訪問(wèn)與修改共用byte類型數(shù)組的baload和 bastore指令。
因?yàn)樵谔摂M機(jī)規(guī)范中說(shuō)了,boolean值在編譯之后都使用Java虛擬機(jī)中的int數(shù)據(jù)類型來(lái)代替,而int是4個(gè)字節(jié),那么boolean值就是4個(gè)字節(jié)。- boolean類型數(shù)組的訪問(wèn)與修改共用byte類型數(shù)組的baload和 bastore指令,因?yàn)閮烧吖灿?,只有兩者字?jié)一樣才能通用呀,所以byte數(shù)組中一個(gè)byte是1個(gè)字節(jié),那么boolean數(shù)組中boolean是1個(gè)字節(jié)。
總結(jié):boolean在數(shù)組情況下為1個(gè)字節(jié),單個(gè)boolean為4個(gè)字節(jié)。
基本數(shù)據(jù)類型的轉(zhuǎn)換
Java 所有的數(shù)值類型可以相互轉(zhuǎn)換,如果系統(tǒng)支持把某種基本類型的值直接賦給另一種基本類型的變量,則這種方式被稱為自動(dòng)類型轉(zhuǎn)換.當(dāng)把一個(gè)表述范圍小的數(shù)值或者變量直接賦給另一個(gè)表數(shù)范圍大的變量時(shí),系統(tǒng)可以進(jìn)行自動(dòng)類型轉(zhuǎn)換.否則就需要強(qiáng)制轉(zhuǎn)換.
自動(dòng)類型轉(zhuǎn)換
表數(shù)范圍小的數(shù)值賦給表數(shù)范圍的變量.
Java 支持自動(dòng)類型轉(zhuǎn)換圖:

除了基本類型的自動(dòng)轉(zhuǎn)換外,把任何基本類型的值和字符串進(jìn)行連接運(yùn)算時(shí),基本類型的值將自動(dòng)轉(zhuǎn)為字符串類型(ps:將基本類型轉(zhuǎn)化為字符串類型時(shí),可以把基本類型的值與空字符串相加).
強(qiáng)制類型轉(zhuǎn)換
如果想把上圖箭頭右邊的數(shù)據(jù)類型轉(zhuǎn)換為左邊的類型,則必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換.強(qiáng)轉(zhuǎn)的格式為(TargetType)value強(qiáng)制類型轉(zhuǎn)換的運(yùn)算符是圓括號(hào).
需要注意強(qiáng)制類型轉(zhuǎn)換會(huì)造成數(shù)據(jù)溢出,從而導(dǎo)致數(shù)據(jù)丟失.
表達(dá)式類型的自動(dòng)提升
當(dāng)一個(gè)算術(shù)表達(dá)式中包含多個(gè)基本類型的值時(shí), 整個(gè)算術(shù)表達(dá)式的數(shù)據(jù)類型將發(fā)生自動(dòng)提升.
Java 自動(dòng)提升規(guī)則:
- 所有的 byte 類型,short 類型和 char 類型將被提升到 int 類型.
- 整個(gè)算術(shù)表達(dá)式的數(shù)據(jù)類型自動(dòng)提升到與表達(dá)式中最高等級(jí)操作同樣的類型.操作數(shù)的等級(jí)如上如所示,箭頭右邊的等級(jí)高于箭頭左邊類型的等級(jí).
引用數(shù)據(jù)類型
類
接口
數(shù)組
運(yùn)算符
算術(shù)運(yùn)算符
-
+: 加法運(yùn)算符(還可以作為字符串的連接運(yùn)算符) -
-: 減法運(yùn)算符 -
*: 乘法運(yùn)算符 -
/: 除法運(yùn)算符
如果除法運(yùn)算的兩個(gè)操作數(shù)都是整數(shù)類型,則計(jì)算結(jié)果也是整數(shù),就是將自然除法的結(jié)果截取取整。如果除法運(yùn)算兩個(gè)操作數(shù)都是整數(shù)類型,則除數(shù)不可以是 0,否則將引發(fā)除以 0 異常。如果一個(gè)或兩個(gè)操作數(shù)是浮點(diǎn)數(shù),則計(jì)算結(jié)果也是浮點(diǎn)數(shù),這個(gè)結(jié)果就是自然除法的結(jié)果,而且此時(shí)允許除數(shù)是 0 或者 0.0,得到的結(jié)果是正無(wú)窮大揮著負(fù)無(wú)窮大。 -
%: 求余運(yùn)算符 -
++: 自加。- 自加是單目運(yùn)算符,只能操作一個(gè)數(shù)。
- 自加運(yùn)算符只能操作單個(gè)數(shù)值型(整形、浮點(diǎn)型)變量,不能操作常量或表達(dá)式。
- 如果 ++ 放在左邊,則先把操作數(shù)加 1,然后才把操作數(shù)放入表達(dá)式中運(yùn)算。如果 ++ 放在右邊,則先把操作數(shù)放入表達(dá)式中運(yùn)算,然后才把操作數(shù)加 1
-
--: 自減。單目運(yùn)算符。與++類似,只是將操作數(shù) -1
位運(yùn)算符
-
&: 按位與。當(dāng)兩位同時(shí)為 1 時(shí)才返回 1. -
|: 按位或。只要有一位為 1 即可返回 1。 -
~: 按位非。單目運(yùn)算符,將操作數(shù)的每個(gè)位(包括符號(hào)位)全部取反。 -
^: 按位異或。當(dāng)兩位相同時(shí)返回0,不同時(shí)返回 1。 -
<<: 左移運(yùn)算符。 -
>>: 右移運(yùn)算符. -
>>>: 無(wú)符號(hào)右移運(yùn)算符.

邏輯運(yùn)算符
-
&&: 與,前后兩個(gè)操作數(shù)必須都是true才返回true,否則飯后false. -
&: 不短路與,與&&作用相同,但不會(huì)短路. -
||:或,只要兩個(gè)操作數(shù)一個(gè)為true,則返回true,否則返回false -
|: 不短路或, 作用與||相同,但不會(huì)短路. -
!: 非. 取反 -
^: 異或. 當(dāng)兩個(gè)操作數(shù)不同時(shí)返回true,相同時(shí)返回false
三目運(yùn)算符
-
?:三目運(yùn)算符只有一個(gè),語(yǔ)法格式為(expression) ? if-true-statement : if-false-statement
注意:
自加和自減只能用于慚怍變量,不能用于操作數(shù)值直接量、常量或表達(dá)式。
賦值運(yùn)算符
=
擴(kuò)展后的賦值運(yùn)算符
-
+=: 對(duì)于x+=y,即對(duì)應(yīng)于x = x + y -
-=: 對(duì)于x-=y,即對(duì)應(yīng)于x = x - y -
*=: 對(duì)于x*=y,即對(duì)應(yīng)于x = x * y -
/=: 對(duì)于x/=y,即對(duì)應(yīng)于x = x / y -
%=: 對(duì)于x%=y,即對(duì)應(yīng)于x = x % y -
|=: 對(duì)于x|=y,即對(duì)應(yīng)于x = x | y -
^=: 對(duì)于x^=y,即對(duì)應(yīng)于x = x ^ y -
<<=: 對(duì)于x<<=y,即對(duì)應(yīng)于x = x << y -
>>=: 對(duì)于x>>=y,即對(duì)應(yīng)于x = x >> y -
>>>=: 對(duì)于x>>>=y,即對(duì)應(yīng)于x = x >>> y
比較運(yùn)算符
-
>: 大于,只支持左右兩邊操作數(shù)是數(shù)值類型. -
>=: 大于等于,只支持左右兩邊操作數(shù)是數(shù)值類型. -
<: 小于,只支持左右兩邊操作數(shù)是數(shù)值類型. -
<=: 小于等于,只支持左右兩邊操作數(shù)是數(shù)值類型. -
==: 等于,如果比較的兩個(gè)操作數(shù)都是數(shù)值類型,即使兩個(gè)操作數(shù)的類型不同,只要他們值相等,也返回true. 如果兩個(gè)操作數(shù)都是引用類型,那么比較的是兩個(gè)操作數(shù)的引用地址. -
!=: 不等于.數(shù)據(jù)類型比較,無(wú)關(guān)類型,只進(jìn)行值比較.引用類型比較對(duì)象的引用地址.
運(yùn)算符的優(yōu)先級(jí)

- 不要把一個(gè)表達(dá)式寫的過(guò)于復(fù)雜,如果一個(gè)表達(dá)式復(fù)雜,則應(yīng)該拆成幾步來(lái)執(zhí)行
- 不要過(guò)多的依賴運(yùn)算符的優(yōu)先級(jí)來(lái)控制表達(dá)式的執(zhí)行順序,盡量用
()來(lái)控制