可变与不可变集合
在 Kotlin 中,集合(Collection)是处理数据的重要工具。Kotlin 标准库提供了两种类型的集合:可变集合(Mutable Collection)和不可变集合(Immutable Collection)。理解它们的区别和使用场景是高效编程的关键。
1. 不可变集合(Immutable Collection)
不可变集合是指创建后内容不可修改的集合。任何试图修改不可变集合的操作(如添加、删除或更新元素)都会导致编译错误。
常见不可变集合类型
List:有序集合,元素可重复Set:无序集合,元素唯一Map:键值对集合
示例代码
val immutableList = listOf("Apple", "Banana", "Orange")
// immutableList.add("Grape") // 编译错误:不可变集合不支持修改操作
val immutableMap = mapOf(1 to "One", 2 to "Two")
// immutableMap[3] = "Three" // 编译错误
2. 可变集合(Mutable Collection)
可变集合允许在创建后动态修改内容(增删改元素)。Kotlin 通过 Mutable 前缀标识可变集合类型。
常见可变集合类型
MutableListMutableSetMutableMap
示例代码
val mutableList = mutableListOf("Red", "Green", "Blue")
mutableList.add("Yellow") // 允许添加元素
mutableList.remove("Red") // 允许删除元素
val mutableMap = mutableMapOf("a" to 1, "b" to 2)
mutableMap["c"] = 3 // 允许添加新键值对
3. 不可变 vs 可变的本质区别
| 特性 | 不可变集合 | 可变集合 |
|---|---|---|
| 修改操作 | 不支持 | 支持 |
| 线程安全性 | 天然线程安全 | 需手动同步 |
| 性能开销 | 较低(无需同步机制) | 较高(可能需同步) |
| 函数式编程友好性 | 更优(纯函数) | 需谨慎使用 |
4. 相互转换
Kotlin 提供了便捷方法在两种集合间转换:
// 不可变 → 可变
val immutable = listOf(1, 2, 3)
val mutableVersion = immutable.toMutableList()
// 可变 → 不可变
val mutable = mutableListOf("A", "B")
val immutableVersion = mutable.toList()
5. 最佳实践建议
默认优先使用不可变集合
- 除非明确需要修改,否则使用
listOf()/mapOf()等不可变版本 - 遵循"不可变性优先"原则减少副作用
- 除非明确需要修改,否则使用
需要修改时再创建可变副本
val original = listOf(1, 2, 3) val modified = original.toMutableList().apply { add(4) }多线程环境下特别注意
- 不可变集合可安全共享
- 可变集合需使用同步机制(如
Collections.synchronizedList())
注意集合的只读视图
val mutable = mutableListOf(1, 2) val readOnlyView: List<Int> = mutable // readOnlyView.add(3) // 编译错误 mutable.add(3) // 实际会影响readOnlyView
通过合理选择集合类型,可以编写出更安全、更高效的 Kotlin 代码。不可变集合在函数式编程风格中尤为重要,而可变集合在需要频繁修改的场景下不可或缺。
