Kotlin 集合:List, Set, Map
Kotlin 的集合框架建立在 Java 之上,但它在語言層面做出了一個非常重要的區分:唯讀 (Read-only) 與 可變 (Mutable)。
這意味著,當你宣告一個 List 時,編譯器會預設它是不可修改的。這大大降低了「意外修改到資料」的風險,讓程式更安全、更容易測試。
List (串列)
List 是一個 有序 (Ordered) 且 可重複 的集合。
你可以透過索引值 (Index) 來存取裡面的元素(例如 list[0])。
不可變 List (Immutable)
使用 listOf() 建立。建立後就不能再變更內容(沒有 add, remove 方法)。
val readOnlyList = listOf("Apple", "Banana")
// readOnlyList.add("Cherry") // 編譯錯誤!它是唯讀的
println(readOnlyList[0]) // 輸出 Apple
可變 List (Mutable)
使用 mutableListOf() 建立。建立後可以隨意增刪改。
val mutableList = mutableListOf("Apple", "Banana")
mutableList.add("Cherry") // OK
mutableList[0] = "Pineapple" // 修改第一個元素
Map (地圖/鍵值對)
Map 是用來儲存 Key-Value (鍵值對) 的容器。
- Key (鍵):必須是唯一的。
- Value (值):可以重複。
建立 Map
Kotlin 提供了一個很直覺的中綴函式 to 來建立鍵值對。
// 不可變 Map
val readOnlyMap = mapOf(
1 to "One",
2 to "Two"
)
// 可變 Map
val mutableMap = mutableMapOf(1 to "One")
mutableMap[2] = "Two" // 新增 key=2
mutableMap[1] = "First" // 修改 key=1 的值
讀取 Map
推薦使用 [] 運算子。
println(readOnlyMap[1]) // 輸出 "One"
Set (集)
Set 是一個 無序 (Unordered) 且 不重複 的集合。 它最常用來做「去除重複資料」或是「檢查某個元素是否存在」。
// 因 Set 特性,重複的 "2" 會被自動過濾掉
val numbers = setOf(1, 2, 2, 3)
println(numbers) // 輸出 [1, 2, 3]
println(numbers.contains(1)) // true
建立空集合
在初始化變數或作為函式預設回傳值時,我們常需要一個「空的集合」。 為了節省記憶體並明確型別,請使用專用的建構函式:
// 明確指定型別為 String
val emptyList = emptyList<String>()
val emptyMap = emptyMap<String, Int>()
val emptySet = emptySet<Int>()
最佳實踐: 盡量回傳「空集合」而不是
null。這樣呼叫端就不需要一直寫 if (list != null) 的檢查。陣列 (Array)
雖然 Kotlin 日常開發推薦使用 List,但在某些場景 (如演算法效能要求極高、或需與 Java 第三方庫互動) 還是會用到 Array。
List 與 Array 的差別:
- List:長度可變 (MutableList),底層實作通常是 ArrayList。
- Array:長度固定 (Fixed size),對應到 JVM 的 Array (如
int[])。
val arr = arrayOf(1, 2, 3)
// Array 轉 List
val list = arr.toList()
// List 轉 Array
val arr2 = list.toTypedArray()
Java 互通性
Kotlin 的集合在編譯後,底層就是 Java 的 java.util.List, java.util.Map 等。
所以你可以無縫地把 Kotlin 集合傳給 Java 函式使用,不需要任何轉換成本。