除了前面討論原始資料型別(Primitive Data Types) 與參考資料型態(Non-Primitive Data Types) 底層存取邏輯上的差異之外,實際使用上兩者還有一些差異特別需要注意。
在 Java 中會去比較兩個變數是否相等會使用 comparison operator(==),但 == 在兩種資料型別中比較的對象是不一樣的。
值
是否相同記憶體位置
是否相同 // Primitive Data Types
int a = 10;
int b = 10;
System.out.println(a == b)
// Out: true
// 兩者的值是相等的
// Non-Primitive Data Types
String a = "hello"
String b = "hello"
System.out.println(a == b)
// Out: false
// 兩者參照的記憶體位置是不相同的
那參考資料型態該如何比較值的大小呢?
這時就可以使用物件(Object)的方法,像是比較字串 String 是否相等,可以使用 equals()
的函示來比對。
// Non-Primitive Data Types
String a = "hello"
String b = "hello"
System.out.println(a.equals(b));
// Out: true
Primitive Data Types 的變數再創建之後會自動賦值;而參考資料型態則不會,若未賦值將會預設為 null。
// Primitive Data Types
int a;
System.out.println(a);
// Out: 0
// 雖然 int 尚未指定其值,但會預設為 0
// Non-Primitive Data Types
String s;
System.out.println(s);
// Out: null
// String 未指定值前會為 null, 而非空字串 ""
這點蠻重要的,因為 Java 對資料型別嚴謹的規定,在建立與資料庫連線的 ORM 模型時,都需要特別留意萬一是空值時,不同的資料型別會有不同的值。
以下是 Primitive Data Types 預設值:
資料型別 | 預設值 | | 資料型別 | 預設值
------ | ------- | | ------ | -------
byte | 0 | | float | 0.0F |
short | 0 | | double | 0.0
int | 0 | | boolean | false
long | 0L | | char | ‘\u0000’
最後是分享一個小原則,原始資料型別以小寫字母開頭,而參考資料型態以大寫字母開頭,但其實原始資料型別就只有 8 種,我是直接把八種原始資料型別背起來,其他的都是參考資料型態,這樣最簡單。