1. 程式人生 > 實用技巧 >Java基礎語法:基本資料型別

Java基礎語法:基本資料型別


  • Java是一種強型別語言每個變數都必須宣告其型別

  • Java的資料型別分為兩大類:基本型別(primitive type)和引用型別(reference type)。

  • Java的所有八種基本型別的資料各自都佔有固定的記憶體空間,最小的佔1位元組,最大的佔8位元組,位元組是一種計算機內部的儲存單位




一、強型別語言

  • 強型別語言也稱為強型別定義語言。要求變數的使用要嚴格符合規定,所有變數都必須先定義後才能使用。一旦一個變數被指定了某個資料型別,如果不經過轉換,那麼它就永遠是這個資料型別了。安全性高,執行效率相對弱型別語言較慢。
  • 弱型別語言也稱為弱型別定義語言。其變數不需要顯式指定資料型別,不同型別的資料之間允許隱式型別轉換。弱型別語言更靈活,執行效率相對高一些,但更容易出錯。




二、儲存單位

Java的所有八種基本型別的資料各自都佔有固定的記憶體空間,最小的佔1位元組,最大的佔8位元組。

計算機內部資料的儲存單位主要分為基本儲存單位擴充套件儲存單位




Ⅰ、基本儲存單位

基本儲存單位有三種:位(bit)位元組(Byte/B)字(Word)

  1. 位(bit):二進位制數中的一個數位,可以是0或者1,是計算機中資料的最小單位。4位為2^4,若轉換成十六進位制表示,範圍為0~F
  2. 位元組(Byte/B):計算機中資料處理的基本單位,習慣上用大寫B來表示。每8位組成一個位元組,若轉換成十六進位制表示,範圍為00~FF。各種資訊在計算機中儲存、處理至少需要一個位元組。
  3. 字(Word):
    通常兩個位元組稱為一個字。漢字的儲存單位都是一個字。

注意:字元(Character)

  • 字元是指計算機中使用的字母、數字、字和符號。
  • 一個字元的大小在不同的字元編碼中是不同的。
  • 在ASCII編碼中,一個英文字母字元儲存需要1個位元組。
  • 在GB2312編碼或GBK編碼中,一個漢字字元儲存需要2個位元組。
  • 在UTF-8編碼中,一個英文字母字元儲存需要1個位元組,一個漢字字元儲存需要3到4個位元組。
  • 在UTF-16編碼中,一個英文字母字元或一個漢字字元儲存都需要2個位元組(Unicode擴充套件區的一些漢字儲存需要4個位元組)。
  • 在UTF-32編碼中,世界上任何字元的儲存都需要4個位元組。




Ⅱ、擴充套件儲存單位

在計算機各種儲存介質(例如記憶體、硬碟、光碟等)的儲存容量表示中,使用者所接觸到的儲存單位不是位、位元組和字,而是KB、MB、GB等,但這不是新的儲存單位,而是基於位元組換算的,換算率均為1024。

單位換算:

  1. 1B = 8b
  2. 1KB = 1024B
  3. 1MB = 1024KB
  4. 1GB = 1024MB
  5. 1TB = 1024GB
  6. 1PB = 1024TB
  7. 1EB = 1024PB
  8. 1ZB = 1024EB
  9. 1YB = 1024ZB
  10. 1BB = 1024YB
  11. 1NB = 1024BB
  12. 1DB = 1024NB




三、基本型別

Java提供了八種基本型別。六種數值型別,其中四個整數型別byteshortintlong),兩個浮點型別floatdouble),一種字元型別char),還有一種布林型別boolean)。




Ⅰ、byte

  • byte 資料型別是Java的整數型別之一。

記憶體大小:1位元組

最小值:-128(-2^7)

最大值:127(2^7 - 1)

預設值:(byte)0




Ⅱ、short

  • short 資料型別是Java的整數型別之一。

記憶體大小:2位元組

最小值:-32768(-2^15)

最大值:32767(2^15 - 1)

預設值:(short)0




Ⅲ、int

  • int 資料型別是Java的整數型別之一,Java的整型變數預設為 int 型別。

記憶體大小:4位元組

最小值:-2,147,483,648(-2^31)

最大值:2,147,483,647(2^31 - 1)

預設值:0




Ⅳ、long

  • long 資料型別是Java的整數型別之一,使用時要在數值後面加上'L'。
  • 'L'理論上不分大小寫,但是若寫成'l'容易與數字'1'混淆,不容易分辨,所以最好大寫。

記憶體大小:8位元組

最小值:-9,223,372,036,854,775,808(-2^63)

最大值:9,223,372,036,854,775,807(2^63 - 1)

預設值:0L




Ⅴ、float

  • float 資料型別是Java的浮點數(小數)型別之一,單精度的浮點數,使用時要在數值後面加上'f'或'F'。

記憶體大小:4位元組

負數範圍:-3.402823E38 ~ -1.401298E-45

正數範圍:1.401298E-45 ~ 3.402823E38

預設值:0.0F




Ⅵ、double

  • double 資料型別是Java的浮點數(小數)型別之一,雙精度的浮點數,使用時可以在數值後面加上'd'或'D'。
  • Java的浮點型變數預設為 double 型別。

記憶體大小:8位元組

負數範圍:-1.79769313486232E308 ~ -4.94065645841247E-324

正數範圍:4.94065645841247E-324 ~ 1.79769313486232E308

預設值:0.0




Ⅶ、char

  • char資料型別是Java的字元型別,是一個單一的16位Unicode字元,必須用單引號括起來。
  • char型別的資料可以被強制型別轉換整型資料,其轉換後的整數數值對應該字元在Unicode編碼表中的編號
  • Unicode編碼被設計用來處理各種語言的所有文字,它佔2個位元組,可允許有65536個字元。
  • Unicode具有從0到65535之間的編碼,他們通常用從'u0000'到'uFFFF'之間的十六進位制值來表示(字首為u表示Unicode)。
  • char型別資料對應Unicode編碼的編號,所以char型別資料也可以用'\uxxxx'(帶單引號,x表示16進位制數值)的方式表示,'\uxxxx'是Java定義的轉義字元之一,表示十六進位制Unicode字元。
  • char型別的資料被強制轉換為整型時,若編號超出該整型型別的範圍,如byte、short型別,那麼轉換結果數值不為其準確的編號。

記憶體大小:2位元組

最小值:\u0000(即為0)

最大值:\uffff(即為65,535)

預設值:'\u0000'

示例:

char charUnicode = '\u0061';
char charEnglish = 'a';
System.out.println(charUnicode == charEnglish);//true
char charChinese = '國';
System.out.println((byte) charChinese);//-3
System.out.println((int) charChinese);//22269




Ⅷ、boolean

  • boolean資料型別是Java的布林型別(邏輯型別),表示一位的資訊,只有兩個值(是或否)。
  • 在《Java虛擬機器規範》一書中的描述:“雖然定義了boolean這種資料型別,但是隻對它提供了非常有限的支援。在Java虛擬機器中沒有任何供boolean值專用的位元組碼指令,Java語言表示式所操作的boolean值,在編譯之後都使用Java虛擬機器中的int資料型別來代替,而boolean陣列將會被編碼成Java虛擬機器的byte陣列,每個元素boolean元素佔8位”。也就是說JVM規範指出boolean當作int處理,也就是4位元組,boolean陣列當做byte陣列處理,這樣我們可以得出:boolean型別單獨使用是4個位元組,在陣列中是1個位元組

記憶體大小:1位元組

兩個值:true、false

預設值:false




四、進位制

  • Java中的整型數值可以使用不同的進位制來表示。
  • 為了區分不同的進位制,各個進位制在Java中有不同的表示規則。
    1. 二進位制要以'0b'或'0B'開頭。例如:0b1010
    2. 八進位制要以'0'開頭。例如:012
    3. 十進位制為整數預設進位制,無特殊表示規則。例如:10
    4. 十六進位制要以'0x'或'0X'開頭,十進位制的數值015,對應十六進位制的09加上AF/af。例如:0xA

示例:

int number2 = 0b1010;
int number8 = 012;
int number10 = 10;
int number16 = 0xA;
System.out.println(number10 == number2);//true
System.out.println(number10 == number8);//true
System.out.println(number10 == number16);//true




五、BigDecimal

  • 由於字長有限,浮點數能夠精確表示的數是有限的,因而也是離散的。浮點數一般都存在舍入誤差,很

    多數字無法精確表示,其結果只能是接近,但不等於;二進位制浮點數不能精確的表示0.1、0.01、0.001這樣

    10的負次冪。並不是所有的小數都能可以精確地用二進位制浮點數表示。最好完全避免使用浮點數進行比較!

  • 浮點型別(float、double)的資料不適合在不容許舍入誤差的金融計算領域,如果需要進行不產生舍入誤差的精確數字計算,需要使用BigDecimal類。

  • java.math下面的兩個有用的類:BigInteger和BigDecimal,這兩個類可以處理任意長度的數值。BigInteger實現了任意精度的整數運算。BigDecimal實現了任意精度的浮點運算。

誤差示例:

float floatNumber = 0.1f;
double doubleNumber = 1.0/10;
System.out.println(floatNumber == doubleNumber);//false
float floatBigNumber = 2333333333f;
float floatAddNumber = floatBigNumber + 1;
System.out.println(floatBigNumber == floatAddNumber);//true




六、轉義字元

  • Java支援一些特殊的轉義字元。
  • 轉義字元在字元(char)和字串(String)中均可使用。

所有轉義字元:

符號 字元含義
\n 換行(0x0a)
\r 回車(0x0d)
\f 換頁符(0x0c)
\b 退格(0x08)
\0 空字元(0x0)
\s 空格(0x20)
\t 製表符
\" 雙引號
\' 單引號
\\ 反斜槓
\ddd 八進位制字元(ddd)
\uxxxx 十六進位制Unicode字元(xxxx)