數據類型:
在計算機語言裏面,是對內存位置的一個抽象表達方式,可以理解爲針對內存的一種抽象的表達方式。分基本數據類型(原始數據類型)和引用數據類型。
基本數據類型:
|-- 數值型
|-- 整數型 byte 、short 、int 、long
|-- 浮點型 float 、double
|-- 字符型 char
|-- 布爾型 Boolean
引用數據類型:
|-- 類 class
|-- 接口 interface
|-- 數組 array
注意:
1, 基本數據類型:變量在聲明之後java就會立刻分配給他內存空間。
如:int a; java會在可使用的內存空間尋找一個佔4個字節的塊給a變量;
2, 引用數據類型:類似指針,它以特殊的方式指向對象實體(具體的值),這類變量聲明時不會分配內存,只是存 儲了一個內存地址。
基本數據類型及其包裝類對應關係:
基本數據類型 包裝類 大小(位) 默認值 範圍
byte (字節) Byte 8 0 -128~127
short (短整型) Short 16 0 -32768~32768
int (整數) Integer 32 0 -2147483648~2147483648
long (長整型) Long 64 0/0l/0L -9233372036854477808 ~ 9233372036854477808
float (浮點型) Float 32 0.0/0.0f -3.40292347E+38 ~ 3.40292347E+38
double (雙精度) Double 64 0.0d -1.79769313486231570E+308
~ 1.79769313486231570E+308
char (字符型) Character 16 ‘\u0000 ’ ‘ \u0000 - u\ffff ’
boolean (布爾型) Boolean 1 false true/false
在操作基本數據類型的時候須要注意的地方:
1,byte b = 4; / / 這句話呢,4 是int類型,在賦值給byte類型的時候,
如果該值範圍在-128~127,那麼JVM進行了自動強轉。
所以如果 byte b = 138 就會報錯。
2,byte b1 = 3;
byte b2 = 4;
b = b1 + b2; //這句話爲什麼錯了呢?? 因爲b1,b2是變量,在這裏在沒有進行加之前,
JVM並不知道,它們的和是否在-128~127,所以會報錯。所以在這裏須要強轉。
3,int x = b1 + b2; 這就是對的,因爲兩個byte 類型進行運算,結果不可以超過int。
4,不用第三方元素,來實現兩個元素的換位操作
a = 3;
b = 5;
a = a^b; // a = 3^5;
b = a^b; // b = 3^5^5 --> b = 3;
a = a^b; // a = 3^5^3 --> a = 5;
Java基本類型在使用字面量賦值的時候的特點:
1,當整數類型的數據使用字面量賦值的時候,默認值爲int類型,就是直接使用0或者其他數字的時候,
值的類型爲int類型,所以當使用long a = 0這種賦值方式的時候,JVM內部存在數據轉換。
2,當實數類型的數據使用字面量賦值的時候,默認值爲double類型。
3,從JDK 5.0開始,Java裏面出現了自動拆箱解箱的操作(有專門整理筆記),即Auto Box操作,
所以在這之前是不能使用以下方式的賦值代碼的:
Integer a = 0;
這種賦值方式不能夠在JDK 1.4以及以下的JDK編譯器中通過,但是JDK 5.0出現了自動拆解箱的操作,
所以在JDK 5.0以上的編譯器中,以上的代碼是可以通 過的。
每種數據類型都存在一個複雜類型的封裝類,每種封裝類都有一個xxxValue()的方法,通過這種方法可以把它引用的對象裏面的值轉化成爲原始變量的值,不僅如此,每個封裝類都還存在一個valueOf(String)的方法直接把字符串對象轉換爲相應的簡單類型。
4,Java中的簡單數據類型的轉換分爲兩種:自動轉換和強制轉換
1) 自動轉換:
自動類型提升如下:
byte->short(char)->int->long->float->double
心得:小數據類型可以自動提升爲大數據類型,但不可以反過來,因爲目的類型的數值範圍應該比源轉換值的範圍要大。
如:int in = ‘a’; //正確
int in = 12.4; //錯誤寫法
關於類型的自動提升,遵循下邊的規則:
所有的byte、short、char類型的值將提升爲int類型;
如果有一個操作數是long類型,計算結果是long類型;
如果有一個操作數是float類型,計算結果是float類型;
如果有一個操作數是double類型,計算結果是double類型;
2)強制轉換:
將“大”數據轉換爲“小”數據時,可以使用強制類型轉換,在強制類型轉換的時候必須使用下邊這種類型語句:
int a = (int)3.14;
只是在上邊這種類型轉換的時候,有可能會出現精度損失。
5,Java中的高精度數:
Java提供了兩個專門的類進行高精度運算:BigInteger與BigDecimal,雖然Java原始變量都具有對應的封裝類型,但是這兩個變量沒有對應的原始類型,而是通過方法來提供這兩種類型的一些運算,其含義爲普通類型能夠做的操作,這兩個類型對應都有,只是因爲精度過大可能效率不夠高。至於這兩個類的具體操作可以參考JDK的相關API文檔。
若要求精度的結果,儘量避免使用float和double:
float和double類型本身是爲了做科學運算,即執行二進制浮點運算而設計,但是卻不能提供完全精確的結果,所以在要求精度的數值中,避免使用float和double,float和double在貨幣運算中尤其不合適,要讓float和double精確表達0.1也是不可能的事。測試一下下邊這段代碼就明白了:
System.out.println(2.02-0.02);
System.out.println(2.02-0.01);
結果是不是出乎意料,這個結果並不是偶然,而是JVM本身設計的目的決定的。而要解決這個問題,最好的辦法是使用BigDecimal、int或者long進行相關運算,特別是貨幣運算,使用BigDecimal代替double是一個很好的辦法。
BigDecimal唯一的缺點在於:BigDecimal沒有相對應的原始類型,所以在進行基本數值運算的時候,需要進行方法調用才能操作,這樣會使得和我們的編程習慣不相符合,若使用int和long,就需要進行簡單的封裝運算。
如果要求四捨五入或者簡單的舍入行爲,使用BigDecimal更加方便。