Java基礎(chǔ) - 數(shù)據(jù)類型和運(yùn)算符

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ù)。
常見(jiàn)字符

字符類型也可以使用十六進(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ī)范沒(méi)有強(qiáng)制指定 boolean 類型的變量所占用的內(nèi)存空間。由于大部分計(jì)算機(jī)在內(nèi)存分配時(shí)允許的最小內(nèi)存單元是字節(jié)(8 位),因此 bit 大部分時(shí)候?qū)嶋H占用 8 位。
Java虛擬機(jī)規(guī)范一書提到 :

  • 在Java虛擬機(jī)中沒(méi)有任何供 boolean值專用的字節(jié)碼指令,Java語(yǔ)言表達(dá)式所操作的
    boolean值,在編譯之后都使用Java虛擬機(jī)中的int數(shù)據(jù)類型來(lái)代替。
  • Java虛擬機(jī)直接支持 boolean類型的數(shù)組,虛擬機(jī)的 navarra指令參見(jiàn)第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)算符
  • ++: 自加。
    1. 自加是單目運(yùn)算符,只能操作一個(gè)數(shù)。
    2. 自加運(yùn)算符只能操作單個(gè)數(shù)值型(整形、浮點(diǎn)型)變量,不能操作常量或表達(dá)式。
    3. 如果 ++ 放在左邊,則先把操作數(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)控制
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容