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
類型來處理.
如果使用一個(gè)巨大的整數(shù)值(超出 int 類型的范圍)時(shí)熄捍,Java 不會(huì)自動(dòng)把這個(gè)整數(shù)值當(dāng)成 long 類型來處理烛恤。如果希望系統(tǒng)把一個(gè)整數(shù)值當(dāng)成 long 類型來處理,應(yīng)在這個(gè)整數(shù)值后增加l
或者L
做后綴余耽。
浮點(diǎn)類型
Java 的浮點(diǎn)類型有固定的表數(shù)范圍和字段長(zhǎng)度缚柏,字段長(zhǎng)度和表數(shù)范圍與機(jī)器無關(guān),Java 的浮點(diǎn)類型遵循 IEEE 標(biāo)準(zhǔn)碟贾,采用二進(jìn)制的科學(xué)計(jì)數(shù)法來表示币喧。
float
一個(gè) float 類型在內(nèi)存中占 4 字節(jié),32 位缕陕,第 1 位是符號(hào)位粱锐,接下來的 8 位表示指數(shù),在接下來的 23 位表示位數(shù)扛邑。
double
一個(gè) double 類型在內(nèi)存中占 8 字節(jié)怜浅,64 位,第 1 位表示符號(hào)位蔬崩,接下來的 11 位表示指數(shù)恶座,在接下來的 52 位表示尾數(shù)。
因?yàn)?Java 浮點(diǎn)數(shù)是用二進(jìn)制的科學(xué)計(jì)數(shù)法來表示浮點(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
來處理,應(yīng)當(dāng)在這個(gè)浮點(diǎn)類型值后面緊跟一個(gè)f
或者F
溅潜。
Java 還提供了三個(gè)特殊的浮點(diǎn)數(shù)值:正無窮大术唬,負(fù)無窮大和非數(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 處理)得到正無窮大(Double/Float 類中的 POSITIVE_INFINITY).使用一個(gè)負(fù)浮點(diǎn)數(shù)除以 0 得到負(fù)無窮大(Double/Float 類中的 NEGATIVE_INFINITY)
表示粗仓。0.0/0.0 將得到一個(gè)非數(shù) NaN.
所有的正無窮大以及負(fù)無窮大都相等,所有的非數(shù)都不相等。
100_000_000_000數(shù)值中的_
方便閱讀。無實(shí)際含義蛛蒙。
字符型
char
字符型有三種表示形式
- 直接通過單個(gè)字符來指定字符型值,例如
'A'
夫否、'9'
和'0'
等. - 通過轉(zhuǎn)移字符標(biāo)識(shí)特殊字符型值,例如
'\n'
、'\t'
- 直接使用
Unicode
值來表示字符型值,格式是'\uXXXX'
橡淆,其中XXXX
代表 一個(gè)十六進(jìn)制的整數(shù)。
字符類型也可以使用十六進(jìn)制編碼方式來表示母赵,范圍是'\u0000'~'\uFFFF'
,一共可以表示 65535
個(gè)字符具滴,其中前 256 個(gè)('\u0000'~'\u00FF'
)字符和 ASCII 碼中的字符完全重合凹嘲。
計(jì)算機(jī)底層保存字符時(shí),實(shí)際上保存的是該字符對(duì)應(yīng)的編號(hào)构韵,因此 char
類型的值可以直接作為整形使用周蹭,它相當(dāng)于一個(gè) 16 位的無符號(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
類型來處理
布爾類型
boolean
用于表示邏輯上的真
或假
, boolean
類型的數(shù)值只能是 true
或者 false
, 不能用 0
或者非0
來表示凶朗,其他基本數(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ù)類型來代替杂数。- Java虛擬機(jī)直接支持 boolean類型的數(shù)組,虛擬機(jī)的 navarra指令參見第6章的newarray小節(jié)可以創(chuàng)建這種數(shù)組宛畦。boolean類型數(shù)組的訪問與修改共用byte類型數(shù)組的baload和 bastore指令。
因?yàn)樵谔摂M機(jī)規(guī)范中說了揍移,boolean值在編譯之后都使用Java虛擬機(jī)中的int數(shù)據(jù)類型來代替次和,而int是4個(gè)字節(jié),那么boolean值就是4個(gè)字節(jié)那伐。- boolean類型數(shù)組的訪問與修改共用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é)果是正無窮大揮著負(fù)無窮大。 -
%
: 求余運(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)算符. -
>>>
: 無符號(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ù)類型比較,無關(guān)類型,只進(jìn)行值比較.引用類型比較對(duì)象的引用地址.
運(yùn)算符的優(yōu)先級(jí)
- 不要把一個(gè)表達(dá)式寫的過于復(fù)雜,如果一個(gè)表達(dá)式復(fù)雜,則應(yīng)該拆成幾步來執(zhí)行
- 不要過多的依賴運(yùn)算符的優(yōu)先級(jí)來控制表達(dá)式的執(zhí)行順序,盡量用
()
來控制