Day1—Java 基本數據類型 – 四類八種 –九五小龐
一、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