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 提供了以下幾種數字型別:

型別位元數範例
Double643.14
Float323.14F (結尾加 F)
Long64100L (結尾加 L)
Int32100
Short16-
Short16-
Byte8-

此外,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)

只有兩個值:truefalse。 支援邏輯運算子:&& (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 類別表示。 它有 getset 方法 (透過 [] 運算子重載),以及 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 是一個非常特殊的型別,代表 「這個值永遠不存在」。 它通常用於:

  1. 永遠丟出 Exception 的函式。
  2. 無窮迴圈。
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) 章節。