基礎篇:java基本數據類型

1:java幾種基本數據類型大小

關鍵字 類型 位數 (8位一字節) 取值範圍(表示範圍)
byte 整型 8 -2^7 ~ 2^7-1
short 整型 16 -2^15 ~ 2^15-1
int 整型 32 -2^31 ~ 2^31-1
long 整型 64 -2^63 ~ 2^63-1
float 浮點數 32 3.402823e+38 ~ 1.401298e-45
double 浮點數 64 1.797693e+308~ 4.9000000e-324
char 文本型 16 0 ~ 2^16-1
boolean 布爾值 32/8 true/false

boolean的佔用大小是多少,有以下說法java

  • 1bit: boolean編譯後的是使用1和0儲存,理論上只需1bit便可儲存
  • 1byte: 計算機處理數據的最小單位是1byte,用一字節的最低位存儲,其餘的用0填補。若是值是true則儲存二進制爲0000 0001,false則是0000 0000
  • 4byte or 1btye: java虛擬機沒有對boolean類型的專用字節碼指令,表達式所操做的boolean在編譯以後是使用int數據類型來代替的,而boolean數組則會被編譯成byte數組

正解 在java裏的正確回答應該是boolean類型單獨使用是4個byte,在數組裏則是1個byte。可是虛擬機爲何不用byte或short代替boolean而是int,這樣不是更節省內存空間?由於int對於32位處理器,一次處理的數據是32位,CPU尋址也是32位的查找,具備高效儲存的特色(若是有更好的理解,你們共同交流下)編程

2:64位的JVM中,int類型長度是多少

32位;int是32位類型,不會隨着系統或者jvm的位數而改變數組

3:char類型變量能不能儲存一箇中文的漢字,爲何

中文unicode編碼方式每一個字符佔用兩個字節,char是16位類型,中文儲存須要兩個字節,所以能夠儲存中文字符。jvm

4:浮點數float和雙精度浮點數double表示法

浮點數的二進制表示法由三部分組成編碼

  • 符號位
  • 指數位
  • 尾數爲

float、double二進制結構spa

類型 符號位 指數位(e) 尾數位(m)
float 1 8 23
double 1 11 52
  • 符號位部分用來儲存數字符號,區分正負數,0 正 1 負
  • 指數位儲存指數,指數也有正負,指數肯定大小範圍.net

    • 指數是有符號的,但有符號整數比無符號整數計算麻煩,所以實際儲存是將指數轉爲無符號整數,8bit的範圍爲0~255,真實的指數須要減去偏移量127。範圍在(-126 ~ 128)
  • 尾數位存儲小數部分,肯定浮點數精度,小數能表示的數越大,精度越大,數值越準確3d

    • float的尾數位是23,2^23=8388608 ,8388608是個7位數的十進制,若是加上忽略的整數位,最多可表示8位的十進制。可是絕對能保證有效是7位左右的十進制數;double尾數位是52,2^52=4503599627370496,16位的數字,加上整數位2^53也是個16位數字,所以絕對能保證有效位精確是15位的十進制數
  • 15.625的存儲示例:code

    • 15.625 換成二進制 1111.101
    • 將1111.101 右移三位,剩小數點前1位: 1.111101 * 2^3
    • 底數位:由於小數點前必是1,所以只需記錄小數點後的位數便可,此時底數是 1111 01 ,低位補零:111 1010 0000 0000 0000 0000
    • 指數位:指數爲3,加上127(反轉時則減去127)得130,指數位二進制爲1000 0010
    • 符號位:正數 0
    • 15.625 在內存的二進制形式表示爲orm

      符號 指數 尾數
      0 1000 0010 111 1010 0000 0000 0000 0000

5:基本類型對應的包裝類,區別

基本類型 包裝類
boolean Boolean
short Short
byte Byte
int Integer
long Long
float Float
double Double
char Character
  • 對於萬物皆對象的java,爲何會存在基本類型?由於java產生對象,通常是需在堆建立維護,再經過棧的引用來使用,可是對於簡單的小的變量,須要在堆建立再使用太麻煩了
  • 爲何會有包裝類

    • 包裝類將基本類型包裝起來,使其具備對象的性質,能夠添加屬性和方法,豐富基本類型的操做
    • 對於泛型編程,或使用collection集合,須要包裝類。由於ArrayList,HashMap的泛型沒法指定基本類型
    • 區別,基本類型能夠直接聲明使用,包裝類須要在堆建立,再經過引用使用;基本類型默認初始值,int爲0,boolean則是true/false,且沒法賦值爲null;而包裝類默認初始值是null
  • 須要注意的點:Byte、Int、Short、Long直接賦值(或使用valueOf)如Integer x = value(value 在-128 ~ 127)是直接引用常量池裏的對象,此時對象比較 == 和 equals 都爲true ;Character聲明值則在0~127 是引用常量池對象、

6:基本類型的自動轉換

自動轉換規則有以下幾個

  • 布爾類型boolean不存在隱式轉換爲其餘類型(非自動封裝類型)
  • 整數類型的自動提高

    • byte -> (short/char) -> int -> long (自動提高鏈)
    • 表示範圍低的數據類型可隱式自動提高爲表示範圍高的數據類型(byte b = 1; short s = b; );無編譯錯誤
    • short 和 char 都是16位,可是不能隱式轉換
  • 字符型數據向整型數據的自動轉換

    • char是無符號類型,表示範圍在(0~2^16-1),可隱式轉爲int或long類型
  • 整型、字符型數據均可向浮點型的自動轉換

    • 由於浮點型能保存的有效數字是限制的,須要考慮轉換後的有效位問題

  • 浮點型數據的自動提高

    • float轉double存在精偏差問題,double若是強制轉float則存在精度丟失問題

7:short s1 = 1; s1 = s1 + 1;有錯嗎? short s1 = 1; s1 += 1;有錯嗎?

  • s1 = s1+1 中的1默認類型是int,表達式中低範圍類型s1會默認轉爲int來相加,獲得int型的結果,最後int型的結果不能隱式轉爲short,編譯報錯
  • s1 += 1; 存在隱含的強制轉化 s1 += 1 -> s1 = (short) s1+ 1; 編譯不會報錯

8:不一樣的基本類型強制轉換,可能會產生什麼問題

  • 浮點型轉整型,精度丟失、數據溢出
  • 取值範圍大的整型轉取值範圍小的整型,數據溢出,高位丟失

9:float f = 3.4; 是否正確?

在java裏,不加後綴修飾的浮點數默認是double類型。double類型不能隱式類型轉成float,編譯會報錯

10:表達式3*0.1 == 0.3 將會返回什麼?true仍是false?

浮點型存在精度問題,3*0.1獲得的double數據尾數位 和 0.3 尾數位是不同的 ,false

11:浮點數和BigDecimal

  • 浮點類型使用二進制存儲,不管float(7),double(15),其有效位是有限制的,存在舍入偏差,精度容易缺失
  • 十進制小數轉爲浮點數再計算,嚴重存在精度問題。那麼是否能夠把十進制小數擴大N倍化爲整數維度來計算,並保留其精度位數,這就是BigDecimal
  • BigDecimal是基於BigInteger來處理計算,BigInteger內部有一個int[] mag,表示存放正數的原字節數組 BigInteger原理
  • 構造BigDecimal時避免使用浮點類型構造,會出現精度問題。儘可能使用字符串來建立BigDecimal,或者使用valueOf方法

    BigDecimal data= new BigDecimal(0.1);
    System.out.println("data:" + data);
    
    result:
    data:0.1000000000000000055511151231257827021181583404541015625
  • BigDecimal 進行除法運算不整除時出現無限循環小數,會拋出 ArithmeticException 異常,須要指定精度
  • 指定精度位數,同時須要指定舍入模式

12:switch語句可否做用在 byte 類型變量上,可否做用在long類型變量上,可否做用在 String 類型變量上?

  • switch(expr) expr 須要時int類型,而byte,char,short 會自動提高爲int,所以能夠做用在switch關鍵字。long,float,double不能自動轉爲int,編譯會報錯
  • String 也不能自動轉爲int,在1.7以前也是不能用在switch。可是1.7以後JDK支持String,經過String.hashCode返回一個int類型,並在case裏再次使用String.equals比較

    //語法糖反編譯
    switch(s.hashCode()){
        default;
            break;
        case 3556498:
            if(s.equals("test")){
                .....
            }
            break;
    }

13:可否在不進行強制轉換的狀況下將一個double值賦值給long類型的變量

不行,由於double取值範圍大於long類型。不強制轉換會編譯報錯。若是使用 += 操做符編譯不會報錯,可是存在隱含的強制轉換

關注公衆號,你們一塊兒交流

參考文章

相關文章
相關標籤/搜索