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