java基礎_01_數據類型與包裝類

 數據類型

       在計算機語言裏面,是對內存位置的一個抽象表達方式,可以理解爲針對內存的一種抽象的表達方式。分基本數據類型(原始數據類型)和引用數據類型

基本數據類型

        |-- 數值型 

                |-- 整數型 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

 

在操作基本數據類型的時候須要注意的地方

1byte b = 4;   / / 這句話呢,int類型,在賦值給byte類型的時候,

     如果該值範圍在-128~127,那麼JVM進行了自動強轉。

    所以如果 byte b = 138 就會報錯。

2byte b1 = 3;

      byte b2 = 4;   

      b = b1 + b2;   //這句話爲什麼錯了呢??  因爲b1,b2是變量,在這裏在沒有進行加之前,

                              JVM並不知道,它們的和是否在-128~127,所以會報錯。所以在這裏須要強轉。

3int 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更加方便。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章