一、Java四大資料型別分類
1、整型
byte 、short 、int 、long
2、浮點型
float 、 double
3、字元型
char
4、布林型
boolean
二、八種基本資料型別
三、資料型別詳細介紹
整型(byte、short、int、long)
雖然byte、short、int、long 資料型別都是表示整數的,但是它們的取值範圍可不一樣。
byte 的取值範圍:-128~127(-2的7次方到2的7次方-1)
short 的取值範圍:-32768~32767(-2的15次方到2的15次方-1)
int 的取值範圍:-2147483648~2147483647(-2的31次方到2的31次方-1)
long 的取值範圍:-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)
由上可以看出 byte、short 的取值範圍比較小,而long的取值範圍時最大的,所以佔用的空間也是最多的。int 取值範圍基本上可以滿足我們的日常計算需求了,所以 int 也是我們使用的最多的一個整型型別。
浮點型(float、double)
float 和 double 都是表示浮點型的資料型別,它們之間的區別在於精確度的不同。
float(單精度浮點型)取值範圍:3.402823e+38~1.401298e-45(e+38 表示乘以10的38次方,而e-45 表示乘以10的負45次方)
double(雙精度浮點型)取值範圍:1.797693e+308~4.9000000e-324(同上)
double 型別比float 型別儲存範圍更大,精度更高。
通常的浮點型資料在不宣告的情況下都是double型的,如果要表示一個資料時float 型的,可以在資料後面加上 "F" 。
浮點型的資料是不能完全精確的,有時候在計算時可能出現小數點最後幾位出現浮動,這時正常的。
字元型(char)
char 有以下的初始化方式:
char ch = 'a'; // 可以是漢字,因為是Unicode編碼
char ch = 1010; // 可以是十進位制數、八進位制數、十六進位制數等等。
char ch = '\0'; // 可以用字元編碼來初始化,如:'\0' 表示結束符,它的ascll碼是0,這句話的意思和 ch = 0 是一個意思。
Java是用unicode 來表示字元,“中” 這個中文字元的unicode 就是兩個位元組。
String.getBytes(encoding) 方法獲取的是指定編碼的byte陣列表示。
通常gbk / gb2312 是兩個位元組,utf-8 是3個位元組。
如果不指定encoding 則獲取系統預設encoding 。
布林型(boolean)
boolean 沒有什麼好說的,它的取值就兩個:true 、false 。
四、基本型別之間的轉換
將一種型別的值賦值給另一種型別是很常見的。在Java中,boolean 型別與其他7中型別的資料都不能進行轉換,這一點很明確。但對於其他7種資料型別,它們之間都可以進行轉換,只是可能會存在精度損失或其他一些變化。
轉換分為自動轉換和強制轉換:
自動轉換(隱式):無需任何操作。
強制轉換(顯式):需使用轉換操作符(type)。
將6種資料型別按下面順序排列一下:
double > float > long > int > short > byte
如果從小轉換到大,那麼可以直接轉換,而從大到小,或char 和其他6種資料型別轉換,則必須使用強制轉換。
1、自動轉換
自動轉換時發生擴寬(widening conversion)。因為較大的型別(如int)要儲存較小的型別(如byte),記憶體總是足夠的,不需要強制轉換。如果將字面值儲存到byte、short、char、long的時候,也會自動進行型別轉換。注意區別,此時從int(沒有帶L的整型字面值為int)到byte/short/char也是自動完成的,雖然它們都比int小。在自動型別轉化中,除了以下幾種情況可能會導致精度損失以外,其他的轉換都不能出現精度損失。
》int--> float
》long--> float
》long--> double
》float -->double without strictfp
除了可能的精度損失外,自動轉換不會出現任何執行時(run-time)異常。
2、強制型別轉換
如果要把大的轉成小的,或者在short與char之間進行轉換,就必須強制轉換,也被稱作縮小轉換(narrowing conversion),因為必須顯式地使數值更小以適應目標型別。強制轉換採用轉換操作符()。嚴格地說,將byte轉為char不屬於narrowing conversion),因為從byte到char的過程其實是byte-->int-->char,所以widening和narrowing都有。強制轉換除了可能的精度損失外,還可能使模(overall magnitude)發生變化。強制轉換格式如下:
(target-type) value;
如果整數的值超出了byte所能表示的範圍,結果將對byte型別的範圍取餘數。例如a=256超出了byte的[-128,127]的範圍,所以將257除以byte的範圍(256)取餘數得到b=1;需要注意的是,當a=200時,此時除了256取餘數應該為-56,而不是200。
將浮點型別賦給整數型別的時候,會發生截尾(truncation)。也就是把小數的部分去掉,只留下整數部分。此時如果整數超出目標型別範圍,一樣將對目標型別的範圍取餘數。
7種基本型別轉換總結如下圖:
3、賦值及表示式中的型別轉換
3.1、字面值賦值
在使用字面值對整數賦值的過程中,可以將int literal賦值給byte short char int,只要不超出範圍。這個過程中的型別轉換時自動完成的,但是如果你試圖將long literal賦給byte,即使沒有超出範圍,也必須進行強制型別轉換。例如 byte b = 10L;是錯的,要進行強制轉換。
3.2、表示式中的自動型別提升
除了賦值以外,表示式計算過程中也可能發生一些型別轉換。在表示式中,型別提升規則如下:
· 所有byte/short/char都被提升為int。
· 如果有一個運算元為long,整個表示式提升為long。float和double情況也一樣。
擴充知識點:Java是面嚮物件語言,其概念為一切皆為物件,但基本資料型別算是個例外哦,基本資料型別大多是面向機器底層的型別,它是 “值” 而不是一個物件,它存放於“棧”中而不是存放於“堆”中,但Java一切皆為物件的概念不是說說而已,它為每一個基本資料型別都做了相應的包裝類,我們日常使用中大多情況下都會使用著這些包裝類:
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
String(字串)
包裝類就是一個物件,它存放於“堆”中。
原文參考:
java的基本資料型別四類八種 - 部落格頻道 - CSDN.NET
Spring , Hadoop, Spark , BI , ML