Kotlin 基本資料型態
在 Kotlin 中,所有東西都是物件。
這意味著我們可以在任何變數上呼叫成員函式和屬性。
雖然在程式碼層面看起來都是物件,但在執行時期 ( Runtime),Kotlin 編譯器會自動優化,將 Int 等基本型別轉成 Java 的 Primitive Type (int) 以提升效能。
比較運算 (== vs ===)
這是在 Kotlin 中非常重要的觀念!
==:比較 數值/內容 是否相等 (Structural Equality),等同於 Java 的.equals()。===:比較 記憶體位址 是否相等 (Referential Equality),等同於 Java 的==。
val a = 100
val b = 100
println(a == b) // true
println(a === b) // true (因為 Int 會被優化為 primitive int)
數字 (Numbers)
Kotlin 提供了以下幾種數字型別:
| 型別 | 位元數 | 範例 |
|---|---|---|
Double | 64 | 3.14 |
Float | 32 | 3.14F (結尾加 F) |
Long | 64 | 100L (結尾加 L) |
Int | 32 | 100 |
Short | 16 | - |
Short | 16 | - |
Byte | 8 | - |
此外,Kotlin 也支援 Unsigned Types (無號整數):UByte, UShort, UInt, ULong。
例如:val u: UInt = 100u。
增強可讀性 (Underscores)
你可以使用底線 _ 來讓長數字更易讀,編譯器會忽略它們:
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val hexBytes = 0xFF_EC_DE_5E
注意:Kotlin 不會自動進行隱式轉型 (Implicit Conversion)。
你不能把 Int 直接塞給 Long,必須顯式轉型。
val a: Int = 100
// val b: Long = a // 錯誤!
val b: Long = a.toLong() // 正確
布林值 (Booleans)
只有兩個值:true 和 false。
支援邏輯運算子:&& (AND), || (OR), ! (NOT)。
val isAdmin = true
val isGuest = false
字元 (Characters)
用單引號 ' 包起來的單一文字。
注意:Char 不是數字 (在 C / Java 中 Char 其實是 ASCII 數字,但在 Kotlin 中不是)。
val letter: Char = 'A'
// val i: Int = letter // 錯誤!不能直接當數字用
// 必須明確轉換
val i: Int = letter.code // 取得 ASCII/Unicode code
陣列 (Arrays)
陣列在 Kotlin 中是由 Array 類別表示。
它有 get 和 set 方法 (透過 [] 運算子重載),以及 size 屬性。
建立陣列
最常用的方式是使用 arrayOf() 函式:
val numbers = arrayOf(1, 2, 3, 4, 5) // Array<Int>
val strings = arrayOf("Apple", "Banana", "Cherry") // Array<String>
如果是要建立 Primitive Type 的陣列 (為了效能,避免 Boxing Overhead),請使用專用的類別:
IntArray, ByteArray, ShortArray 等。
val intArray: IntArray = intArrayOf(1, 2, 3)
// 也可以指定大小並初始化
val zeros = IntArray(5) // [0, 0, 0, 0, 0]
存取元素
使用 [] 來存取或修改:
val arr = arrayOf(1, 2, 3) println(arr[0]) // 1 arr[0] = 100 // 修改
關於陣列的更多進階操作 (例如排序、過濾、多維陣列),請參考完整的 Kotlin 陣列 (Arrays) 教學文章。
## 特殊型別 (Any, Unit, Nothing)
### Any
`Any` 是 Kotlin 中 **所有型別的根 (Root)** (包含 Int 等基本型別)。
這有點像 Java 的 `Object`,但 `Any` 不能是 `null` (如果是 `Any?` 才可以)。
```kotlin
val something: Any = 100
val somethingElse: Any = "Hello"
Unit
Unit 對應到 Java 的 void。
如果一個函式沒有回傳任何有意義的值,它其實是回傳 Unit。
通常我們不需要顯式寫出來。
fun printHello(): Unit { // : Unit 可以省略
println("Hello")
}
Nothing
Nothing 是一個非常特殊的型別,代表 「這個值永遠不存在」。
它通常用於:
- 永遠丟出 Exception 的函式。
- 無窮迴圈。
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}
// 因為 fail 回傳 Nothing,編譯器知道接下來的 code 不會被執行
val data = input ?: fail("Input is null")
可空型別 (Nullable Types)
Kotlin 的型別系統區分了「可以為 null」和「不可為 null」的參考。
預設情況下,一般型別 (如 String, Int) 都 不能是 null。
如果要允許變數為 null,必須在型別後加上問號 ?:
var a: String = "abc"
// a = null // 編譯錯誤
var b: String? = "abc"
b = null // 合法
這能有效防止 NullPointerException (NPE)。
更多關於 Null 的處理 (如 ?., ?:, !!),請參考 空值安全 (Null Safety) 章節。