java基本8種數(shù)據(jù)類型

文章大綱
1.介紹基本數(shù)據(jù)類型的相關特點
2.數(shù)據(jù)類型注意事項
3.相關考題解析

基本數(shù)據(jù)類型的相關特點

8種基本數(shù)據(jù)類型

一張圖概括全部的數(shù)據(jù)類型,主要的研究的是上面的基本數(shù)據(jù)類型,下面再以各種數(shù)據(jù)類型所占字節(jié)數(shù)大小再重新分類一遍幫助記憶:

基本數(shù)據(jù)類型所占字節(jié)數(shù)
boolean
布爾類型

再強調(diào)一遍:只有true和false

byte

1位(是數(shù)據(jù)的最小單位) ,但是大多數(shù)情況下數(shù)據(jù)最小單位為1個字節(jié)(byte)因為1 bit 的信息量太少了。要表示一個有用的信息,需要好幾個bit一起表示。我們的其他基本數(shù)據(jù)類型都是由byte組成。

那么講到字節(jié)就稍微提一下字符編碼 ASCII,Unicode和UTF-8之間的概念和由來。

ASCII是上個世紀60年代,美國制定了一套字符編碼,對英語字符與二進制位之間的關系,做了統(tǒng)一規(guī)定。這被稱為ASCII碼,一直沿用至今。它由一個字節(jié)組成也就是8位,一共表示128個字符。因為西方的英文就26個字母,再加上大寫字母各種其他的符號。128也是夠用的了(因為第一位規(guī)定為0 所以就只表示128個字符啦)

ASCII字符表

但是西方國家還有很多,比如德國法國等,他們的語言也需要一套字符編碼,不過都是在一個字節(jié)之內(nèi)就能解決的事情。每個國家就定義了自己的一套標準

其中最常見的ISO/IEC 8859-1就是法語,芬蘭語所用的西歐字符集

但是中文就比較復雜,有10萬多個漢字,那么這意義著要更多的字節(jié)去表示這些漢字

然后同一段字節(jié)流到了不同的國家可能因為標準不同,導致會變出各種奇怪的符號,也就是不統(tǒng)一了。

那么最終還是要統(tǒng)一的,就出現(xiàn)了unicode全世界每個不同語言的不同字符都統(tǒng)一編碼,全球通行。默認unicode采用2個字節(jié),先講這么多。不要跑題了。

char
char的基本特點

有一道面試題:java中的一個char變量能否表示一個漢字,為什么?

當時我是有點懵逼的,到底可以還是不可以呢?(希望有大神能詳細解答一下)

我查了一下正確答案是可以的 unicode是2個字節(jié) (16位)可以表示漢字。

整型常量和浮點型常量
整型常量的范圍和占用空間
浮點型常量的范圍和占用空間

補充一下相關字節(jié)和位的知識:
1個字節(jié)=8位 8位代表256個數(shù)字 第一位符號位 0 正 1負 其余7位代表數(shù)字 2^7=127 因為只有一個0
當1 0000000時表示-128 所以 byte為 -128-127 其他類型以此類推

問題1:在不同的位數(shù)的操作系統(tǒng)上 是否基本數(shù)據(jù)類型所表示的范圍相同呢?

答:在C/C++上是不同的,但是在java上是相同的。

 32位編譯器:
      char :1個字節(jié)

      char*(即指針變量): 4個字節(jié)(32位的尋址空間是2^32, 即32個bit,也就是4個字節(jié)。同理64位編譯器)

      short int : 2個字節(jié)

      int:  4個字節(jié)

      unsigned int : 4個字節(jié)

      float:  4個字節(jié)

      double:   8個字節(jié)

      long:   4個字節(jié)

      long long:  8個字節(jié)

      unsigned long:  4個字節(jié)
  64位編譯器:
      char :1個字節(jié)

      char*(即指針變量): 8個字節(jié)

      short int : 2個字節(jié)

      int:  4個字節(jié)

      unsigned int : 4個字節(jié)

      float:  4個字節(jié)

      double:   8個字節(jié)

      long:   8個字節(jié)

      long long:  8個字節(jié)

      unsigned long:  8個字節(jié)

以上占用字節(jié)數(shù)其實是針對c/c++語言而言的,對于java來說由于其JVM具有跨平臺性因此java在32位和64位機下基本數(shù)據(jù)類型占字節(jié)數(shù)是一致的(這樣才能達到跨平臺通信)。

問題2:
如果是在不同位數(shù)的jvm上呢?32位的jvm和64位的jvm是否表示范圍相同?

看到這個問題的我,是一臉懵逼的。

個人感覺應該不同吧,畢竟java是跑在jvm上的所以和操作系統(tǒng)的位數(shù)沒關。那么jvm的位數(shù)應該就有關了吧。(希望有大神能解答)

數(shù)據(jù)類型注意事項

1.自動類型轉換

本數(shù)據(jù)類型中,布爾類型boolean占有一個字節(jié),由于其本身所代碼的特殊含義,boolean類型與其他基本類型不能進行類型的轉換(既不能進行自動類型的提升,也不能強制類型轉換), 否則,將編譯出錯。

轉換圖

轉換圖的幾點說明:
1.紅色的int和double代表,在Java中,整數(shù)類型(byte/short/int/long)中,對于未聲明數(shù)據(jù)類型的整形,其默認類型為int型。在浮點類型(float/double)中,對于未聲明數(shù)據(jù)類型的浮點型,默認為double型。

2.上下兩個大的藍色箭頭表示,從低到高類型自動轉換,高到低需要強制轉換,原因很簡單,高位表示的范圍大,低位表示的范圍小。

3.在byte char short之間的爆炸符號,代表的意思雖然類型從小到大自動轉換,但是byte不能轉成char,char也不能轉成short。因為byte和short是是數(shù)值型的變量,char字符型的變量。數(shù)值型變量有符號(第一位)而在char中則無正負之分。byte轉short自然就是可以的了。

例題引出問題:

package com.corn.testcast;

public class TestCast {

    public static void main(String[] args) {
        long a = 10000000000; //編譯出錯: The literal 10000000000 of type int is out of range 
        long b = 10000000000L; //編譯正確
        int c = 1000;
        long d = c;
        float e = 1.5F;
        double f = e;
    }

}

a錯的原因是,整型數(shù)默認為int型,而這個數(shù)字大小已經(jīng)超過了int的范圍,又沒有在后面加L表示為long所以就錯了。b就是很好的修正例子。

例題引出問題2:

package com.corn.testcast;

public class TestCast {

    public static void main(String[] args) {
        byte p = 3; // 編譯正確:int到byte編譯過程中發(fā)生隱式類型轉換
        int  a = 3;
        byte b = a; // 編譯出錯:cannot convert from int to byte
        byte c = (byte) a; // 編譯正確
        float d = (float) 4.0;
    }

}

p正確的原因是首先3是一個int型的數(shù)值,并且沒有超過int的范圍,其次再看這個p的類型為byte,在進行隱式轉換沒有溢出,包含在byte的范圍中。所以正確。

b錯誤的原因是a是int型的3,雖然這個大小也在byte的范圍中。但是在編譯過程中,b被賦值的是變量a,事先不知道是否a的大小能在byte范圍中。保險起見編譯出錯。

c正確的原因是加了強制轉換
d也是,默認4.0為double型,然后強制轉換當然就正確了。可是為什么不像p一樣,做隱式轉換呢(求大神詳解)。好像是浮點存在精度問題,而整型沒有。

例題引出問題3:

package com.corn.testcast;

public class TestCast {

    public static void main(String[] args) {
        int a = 233;
        byte b = (byte) a;
        System.out.println("b:" + b);  // 輸出:-23
    }

}

看到這里的b輸出是一個負數(shù),那么這里的原因是因為,看到int的a=233這個是超過了byte的范圍了。然后a強制轉換成b,我們先把a換成二進制24位0 + 11101001(int為4個字節(jié) 32位) 只取最低的8位,一共截取8位(byte所占用的空間大?。?。然后因為最高位為1代表負數(shù) 所以b為-23

問題來了,我們看11101001這個二進制表示的不是-23呀,這是怎么得來的-23呢?

原因是計算機中的數(shù)據(jù)運算都是通過補碼來運行的。兩個數(shù)通過各自補碼進行加減運算,得出的補碼結果再轉成原碼就是正確的計算結果。我們看到11101001是溢出的,其實是補碼。轉成原碼后就是-23了。第一位符號位不變,然后取反加1.、

  1. 不能對boolean類型進行類型轉換。

  2. 不能把對象類型轉換成不相關類的對象。

long a=123;//long類型 不加L默認是int 當數(shù)字范圍在int之內(nèi) int自動轉long不報錯
long b=11111111111;//報錯 因為超過了int的范圍又不加L

相關考題解析

1.short s1 = 1; s1 = s1 + 1;對還是錯 為什么? short s1 = 1; s1 +=1;對還是錯 為什么?

2.int 和 Integer 有什么區(qū)別?

3.我們能將 int 強制轉換為 byte 類型的變量嗎?如果該值大于 byte 類型的范圍,將會出現(xiàn)什么現(xiàn)象?

4.a = a + b 與 a += b 的區(qū)別

  1. 存在使i + 1 < i的數(shù)嗎()
    答案:存在
    解析:如果i為int型,那么當i為int能表示的最大整數(shù)時,i+1就溢出變成負數(shù)了,此時不就<i了嗎。
    擴展:存在使i > j || i <= j不成立的數(shù)嗎()
    答案:存在
    解析:比如Double.NaN或Float.NaN

  2. 0.6332的數(shù)據(jù)類型是()
    A float B double C Float D Double
    答案:B
    解析:默認為double型,如果為float型需要加上f顯示說明,即0.6332f

參考文獻:
Java面試題--數(shù)據(jù)類型和java基礎
Java總結篇系列:類型轉換/造型

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 第一類:邏輯型boolean 第二類:文本型char 第三類:整數(shù)型(byte、short、int、long) c...
    Jasonme閱讀 1,188評論 0 4
  • 目錄:1.基本數(shù)據(jù)類型2.引用數(shù)據(jù)類型 數(shù)據(jù)類型: Java語言是一個強類型語言 1.所有變量,必須先聲明類型...
    Ansaxnsy閱讀 1,117評論 0 7
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向對象的用電信息數(shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,297評論 6 13
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,623評論 18 399
  • 他倆上學的時候一個班,但也不是多么熟悉。期間她轉學,所以根本說沒有什么交集。造化弄人,上大學,他倆居然考入了同一所...
    曼箬漓閱讀 439評論 0 10

友情鏈接更多精彩內(nèi)容