天天看點

Java 資料類型Java 資料類型

Java 資料類型

知識點

Java 資料類型Java 資料類型

資料類型分類

Java 中的資料類型有兩類:

  • 值類型(又叫内置資料類型,基本資料類型)
  • 引用類型

值類型和引用類型的差別

  • 從概念方面來說
    • 基本類型:變量名指向具體的數值。
    • 引用類型:變量名指向存資料對象的記憶體位址。
  • 從記憶體建構方面來說
    • 基本類型:變量在聲明之後,Java 就會立刻配置設定給他記憶體空間。
    • 引用類型:它以特殊的方式(類似 C 指針)向對象實體(具體的值),這類變量聲明時不會配置設定記憶體,隻是存儲了一個記憶體位址。
  • 從使用方面來說
    • 基本類型:使用時需要賦具體值,判斷時使用

      ==

      号。
    • 引用類型:使用時可以賦 null,判斷時使用

      equals

      方法。

值類型

​Java 的每種基本類型所占存儲空間的大小是固定的。它們的大小不像其他大多數語言那樣随機器硬體架構的變化而變化。這種不變性是Java程式相對其他大多數語言而言,更容易移植的原因之一。

所有數值類型都有正負号,是以不要去尋找無符号的數值類型。

與絕大多數程式設計語言類似,Java 也支援數值型、字元型、布爾型資料。

Java 語言提供了 8 種基本類型,大緻分為 4 類

  • 整數型
    • byte:8 位,最大存儲資料量是 255,存放的資料範圍是 -128 ~ 127 之間。
    • short:16 位,最大資料存儲量是 65536,資料範圍是 -32768 ~ 32767 之間。
    • int:32 位,最大資料存儲容量是 2 的 32 次方減 1,資料範圍是負的 2 的 31 次方到正的 2 的 31 次方減 1。
    • long:64 位,最大資料存儲容量是 2的 64 次方減 1,資料範圍為負的 2 的 63 次方到正的 2 的 63 次方減 1。
  • 浮點型
    • float:32 位,資料範圍在 3.4e-45 ~ 1.4e38,直接指派時必須在數字後加上 f 或 F。
    • double:64 位,資料範圍在 4.9e-324 ~ 1.8e308,指派時可以加 d 或 D 也可以不加。
  • 字元型
    • char:16 位,存儲Unicode碼,用單引号指派。
  • 布爾型
    • boolean:隻有 true 和 false 兩個取值。

對于數值類型的基本類型的取值範圍,我們無需強制去記憶,因為它們的值都已經以常量的形式定義在對應的包裝類中了。

示例:

public class DataTypeScopeDemo {

    public static void main(String[] args) {
        // byte
        System.out.println("基本類型:byte 二進制位數:" + Byte.SIZE);
        System.out.println("包裝類:java.lang.Byte");
        System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);
        System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);
        System.out.println();
    }
};           

輸出:

基本類型:byte 二進制位數:8
包裝類:java.lang.Byte
最小值:Byte.MIN_VALUE=-128
最大值:Byte.MAX_VALUE=127           

資料轉換

自動轉換

一般情況下,定義了某資料類型的變量,就不能再随意轉換。但是JAVA允許使用者對基本類型做有限度的類型轉換。

如果符合以下條件,則JAVA将會自動做類型轉換:

  • 由“小”資料轉換為“大”資料

    顯而易見的是,“小”資料類型的數值表示範圍小于“大”資料類型的數值表示範圍,即精度小于“大”資料類型。

    是以,如果“大”資料向“小”資料轉換,會丢失資料精度。比如:long 轉為 int,則超出 int 表示範圍的資料将會丢失,導緻結果的不确定性。

    反之,“小”資料向“大”資料轉換,則不會存在資料丢失情況。由于這個原因,這種類型轉換也稱為擴大轉換。

    這些類型由“小”到“大”分别為:(byte,short,char) < int < long < float < double。

    這裡我們所說的“大”與“小”,并不是指占用位元組的多少,而是指表示值的範圍的大小。

  • 轉換前後的資料類型要相容

    由于 boolean 類型隻能存放 true 或 false,這與整數或字元是不相容的,是以不可以做類型轉換。

  • 整型類型和浮點型進行計算後,結果會轉為浮點類型
long x = 30;
float y = 14.3f;
System.out.println("x/y = " + x/y);           
x/y = 1.9607843           

可見 long 雖然精度大于 float 類型,但是結果為浮點數類型。

強制轉換

在不符合自動轉換條件時或者根據使用者的需要,可以對資料類型做強制的轉換。

轉換方式為:在數值的前面用一個括号

()

把要強制轉換的類型标注出來。

float f = 25.5f;
int x = (int)f;
System.out.println("x = " + x);           

裝箱和拆箱

包裝類

Java 中基本類型的包裝類如下:

  • Byte <-> byte
  • Short <-> short
  • Integer <-> int
  • Long <-> long
  • Float <-> float
  • Double <-> double
  • Character <-> char
  • Boolean <-> boolean

裝箱

裝箱是将值類型轉換為引用類型。

例:

Integer i1 = new Integer(10); // 非自動裝箱
Integer i2 = 10; // 自動裝箱
System.out.println("i1 = " + i1);
System.out.println("i2 = " + i2);           

拆箱

拆箱是将引用類型轉換為值類型。

int i1 = new Integer(10); // 自動拆箱
Integer tmp = new Integer(20);
int i2 = tmp.intValue(); // 非自動拆箱
System.out.println("i1 = " + i1);
System.out.println("i2 = " + i2);           

使用裝箱的場景

一種最普通的場景是:調用一個含類型為 Object 參數的方法,該 Object 可支援任意類型(因為 Object 是所有類的父類),以便通用。當你需要将一個值類型(如 Integer)傳入時,需要裝箱。

另一種用法是,一個非泛型的容器,同樣是為了保證通用,而将元素類型定義為 Object。于是,要将值類型資料加入容器時,需要裝箱。

自動裝箱、自動拆箱

基本資料(Primitive)型的自動裝箱(boxing)拆箱(unboxing)自 JDK 5 開始提供的功能。

JDK 5 之前的形式:

Integer i1 = new Integer(10); // 非自動裝箱           

JDK 5 之後:

Integer i2 = 10; // 自動裝箱           

Java 對于自動裝箱和拆箱的設計,依賴于一種叫做享元模式的設計模式(有興趣的朋友可以去了解一下源碼,這裡不對設計模式展開詳述)。