Java基本類型

Java是強(qiáng)類型的語言,這意味著必須為每一個變量聲明類型,根據(jù)最新(Java SE 14 Edition),Java一共有兩種類型數(shù)據(jù)類型:primitiveType, referenceType。[1]

基本概念

整型

類型 存儲需求 取值范圍
byte 1 byte -128 ~ 127 ( -2^7 ~ 2^7-1)
short 2 bytes -32 768 ~ 32 767 ( -2^15 ~ 2^15-1)
int 4 bytes -2 147 483 648 ~ 2 147 483 647 ( -2^31 ~ 2^31-1 , 超過20億)
long 8 bytes -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 ( 超過90萬兆 )

byte 和 short 主要用于特定的場合,如底層的文件處理或者需要控制占用存儲空間量的大數(shù)組, 與C, C++不同, Java整型的范圍與運(yùn)行Java代碼的機(jī)器無關(guān),這就解決了Java語言跨平臺的問題,不會存在在32位系統(tǒng)與64位系統(tǒng)內(nèi)存溢出等問題,且Java沒有任何無符號(unsigned)形式的int, long, byte, short。

浮點類型

類型 存儲需求 取值范圍
float 4 bytes +- 3.402 823 47E+38F (有效位數(shù) 6~7 位)
double 8 bytes +- 1.797 693 134 862 315 70E+308 (有效位數(shù) 15 位)

具體的float, double取值方范圍計算可以參考IEEE 754[2],注意,浮點數(shù)不能用于無法接收舍入誤差的金融計算中,因為二進(jìn)制系統(tǒng)無法精確地表示分?jǐn)?shù) 1/10, 如不允許舍入誤差可以使用 BigDecimal

System.out.println(2.0 - 1.1) // 0.89999999999

char

char 類型大小為 2 字節(jié),可以用16進(jìn)制表示, 范圍為 \u0000 ~ \Uffff (共65536個)

Unicode編碼 與 char 類型

在計算機(jī)的發(fā)展過程中,出現(xiàn)了很多編碼方式,也是我們在開發(fā)過程中經(jīng)常會遇到亂碼問題的原因,簡單整理出現(xiàn)過的編碼類型如下表。

編碼類型 字節(jié)數(shù) 國家/組織 時間
ASCII 1 byte (標(biāo)準(zhǔn)ASCII碼128個字符, 后128個為擴(kuò)展ASCII碼) 美國 1967年
GB2312-80 2 bytes 中國 1980年
GBK 2 bytes 中國 1995年
ISO-8859-1 1 byte ECMA 1987年
Unicode 1.0 2 bytes Unicode Consortium 1991年

這里具體介紹下Unicode, 在Unicode之前有很多編碼標(biāo)準(zhǔn),這就造成了兩個問題:

  • 對于任意給定的代碼值,在不同的編碼方案下有可能對應(yīng)不同的字母
  • 采用大字符集的語言其編碼長度可能不同

設(shè)計Unicode編碼規(guī)則的初衷就是解決以上兩個問題,在20世紀(jì)80年度開始啟動設(shè)計工作時,人們認(rèn)為兩個字節(jié)的代碼寬度足以對世界上各種語言的所有字符進(jìn)行編碼,并可以給未來留下擴(kuò)展空間,1991年發(fā)布的Unicode 1.0僅使用2個字節(jié), 后來加入了大量的漢語、日語和韓語,很快 16 位的 char 類型已經(jīng)不能滿足需求了。

碼點: 與一個編碼表中的某個字符對應(yīng)的代碼值

代碼級別(code plane):Unicode的代碼級別可以分成17個代碼級別:

  • 第一個代碼界別成為基本的多語言級別(basic multilingual plane), 碼點從U0000到UFFFF,其中包括京東的Unicode代碼。
  • 其余的16個級別的碼點從U+10000到U10FFFF, 其中包括一下輔助字符(supplementary character)

UTF-16編碼采用了不同長度的編碼標(biāo)識所有的Unicode碼點(code unit) 在基本的多語言級別匯中,每個字符用16位表示,通常被成為代碼單元(code unit),而輔助字符采用一對連續(xù)的代碼單元進(jìn)行編碼。

在Java 中, char類型描述了UTF-16編碼的一個代碼單元, 這里不建議在程序中使用 char 類型,除非確實需要處理UTF-16代碼單元,最好將將字符串作為抽象數(shù)據(jù)類型處理。

可以使用Character 類中的 isJavaidentifierStartisJavaIdentifierPart來判斷 java 是否支持該 Unicode 字符。

基本類型轉(zhuǎn)換

圖片上傳失敗

Java數(shù)值類型轉(zhuǎn)換規(guī)則如上圖,實線表示無京都損失,虛線表示存在精度損失,簡單總結(jié)規(guī)則:

  • 兩數(shù)中存在一個double類型,則另一個會轉(zhuǎn)換為double類型
  • 兩數(shù)中存在一個float類型,則另一個會轉(zhuǎn)換為float類型
  • 兩數(shù)中存在一個long類型,則另一個會轉(zhuǎn)換為long類型
  • 否則,兩個操作數(shù)轉(zhuǎn)化為int類型

強(qiáng)制類型轉(zhuǎn)換

關(guān)于數(shù)值類型的強(qiáng)制類型轉(zhuǎn)換有幾點注意點:

byte a = 1;
byte b = a + 1; // throw error
byte b = (byte) (a + 1); // rihgt

第二行代碼會報錯,原因在于:根據(jù)上面介紹的規(guī)則,對 b 進(jìn)行賦值運(yùn)算時右邊式子的值會轉(zhuǎn)化為 int 類型,此時需要 加上強(qiáng)制類型轉(zhuǎn)換才行。

byte a = 1;
a += 1.0; // euqals to   a = (byte) a + 1.0 ---  a = 2

上述代碼第二行不會報錯,因為當(dāng)二元運(yùn)算符左邊的類型與右邊的類型不同時將會自動發(fā)生強(qiáng)制類型轉(zhuǎn)換。

歡迎大家留言評論,感興趣可以來Github參觀,Star,F(xiàn)ork,PR三連

Reference

  1. The Kinds of Types and Values
  2. IEEE 754
  3. Java核心技術(shù)·卷 I(原書第10版)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容