## java數據類型
**Java四大數據類型分類**
>**1.整型(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 也是我們使用的最多的一個整型類型。**
>**2.浮點型(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" 。**
**浮點型的數據是不能完全精確的,有時候在計算時可能出現小數點最后幾位出現浮動,這時正常的。**
>**3.字符型(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 。
>**4.布爾型(boolean)**
**boolean 沒有什么好說的,它的取值就兩個:true 、false 。**
*****
## **基本類型之間的轉換**
>將一種類型的值賦值給另一種類型是很常見的。在Java中,boolean 類型與其他7中類型的數據都不能進行轉換,這一點很明確。但對于其他7種數據類型,它們之間都可以進行轉換,只是可能會存在精度損失或其他一些變化。
>轉換分為自動轉換和強制轉換:
>自動轉換(隱式):無需任何操作。
**自動轉換時發生擴寬(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
>強制轉換(顯式):需使用轉換操作符(type)。
**如果要把大的轉成小的,或者在short與char之間進行轉換,就必須強制轉換,也被稱作縮小轉換(narrowing conversion),因為必須顯式地使數值更小以適應目標類型。強制轉換采用轉換操作符()。嚴格地說,將byte轉為char不屬于narrowing conversion),因為從byte到char的過程其實是byte-->int-->char,所以widening和narrowing都有。強制轉換除了可能的精度損失外,還可能使模(overall magnitude)發生變化。強制轉換格式如下:**
~~~java
(target-type) value;
~~~
如果整數的值超出了byte所能表示的范圍,結果將對byte類型的范圍取余數。例如a=256超出了byte的\[-128,127\]的范圍,所以將257除以byte的范圍(256)取余數得到b=1;需要注意的是,當a=200時,此時除了256取余數應該為-56,而不是200。
將浮點類型賦給整數類型的時候,會發生截尾(truncation)。也就是把小數的部分去掉,只留下整數部分。此時如果整數超出目標類型范圍,一樣將對目標類型的范圍取余數。
7種基本類型轉換總結如下圖:
>
>將6種數據類型按下面順序排列一下:
>double > float > long > int > short > byte
>如果從小轉換到大,那么可以直接轉換,而從大到小,或char 和其他6種數據類型轉換,則必須使用強制轉換。
*****
## **賦值及表達式中的類型轉換**
**字面值賦值**
>在使用字面值對整數賦值的過程中,可以將int literal賦值給byte short char int,只要不超出范圍。這個過程中的類型轉換時自動完成的,但是如果你試圖將long literal賦給byte,即使沒有超出范圍,也必須進行強制類型轉換。例如 byte b = 10L;是錯的,要進行強制轉換。
**表達式中的自動類型提升**
除了賦值以外,表達式計算過程中也可能發生一些類型轉換。在表達式中,類型提升規則如下:
>所有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(字符串)
```
包裝類就是一個對象,它存放于“**堆**”中。
>## **總結**
| 類型 | 字節長度 | ?取值范圍|默認值|包裝類|
| --- | --- | --- | --- | --- |
| byte| ?1字節 |[-128,127][-2^7,2^7-1]|0|Byte|
| short| ?2字節 |[-32768,32767][-2^15,2^15-1]|0|Short|
| int | ?4字節 |[-2147483648,2147483647][-2^31,2^31-1]|0|Integer|
| long| ?8字節 |[-9223372036854775808,9223372036854775807][-2^63,2^63-1]|0L或0l|Long|
| float| ?4字節 |32位IEEE 754單精度范圍|0.0F或0.0f|Float|
| double| ?8字節 |64位IEEE 754雙精度范圍|0.0|Double|
| char| ?2字節 |Unicode [0,65535]|u0000|Character|
| boolean| ?1字節 |true和false|false|Boolean|
【注】Java中的數據類型都是有符號的,不存在無符號的數,它們的取值范圍也是固定的,不會隨著硬件環境或操作系統的改變而改變。在Java語言中,默認聲明的小數是double類型的,因此在對float類型的變量進行初始化時需要進行類型轉換。類似地,直接寫的整型數字是int類型的,如果在給數據類型為long的變量直接賦值時,也需要進行類型轉換。
【隱式數據類型轉換】在java語言中,當參與運算的兩個變量的數據類型不同時,就需要進行隱式的數據類型轉換。轉換的規則為:從低精度向高精度轉換,即優先級滿足byte<short<char<int<long<float<double。但是基本數據類型與boolean類型是不能相互轉換的。
【強制類型轉換】當需要從高級數據類型轉換為低級數據類型時,就需要進行強制類型轉換,但是需要注意的是,在強制類型轉換后,可能會損失精度。強制類型轉換的規則如下:
| 原操作數類型 | 轉換后操作數類型 |
| --- | --- |
| byte |char |
|char| byte,char|
| short | byte,char|
| char | byte,char|
| int | byte,char,short|
| long| byte,char,short,int|
| float | byte,char,short,int,long|
| double | byte,char,short,int,long,float,double|