Kotlin 常用数据结构全面解析
作为现代JVM语言的代表,Kotlin在数据结构的处理上既保留了Java集合框架的强大能力,又通过扩展函数和函数式API大幅提升了开发效率。本文将系统介绍Kotlin中常用的数据结构及其典型应用场景。
一、线性数据结构
1. 数组(Array)
Kotlin中的数组是固定大小的容器,提供类型安全的访问方式:
// 创建方式
val intArr = arrayOf(1, 2, 3) // 通用数组
val primitiveArr = intArrayOf(1, 2, 3) // 基本类型数组(性能更优)// 特有操作
intArr.forEach { println(it) } // 函数式遍历
val squares = intArr.map { it * it } // 映射新数组
特点:
- 内存连续分配,随机访问效率O(1)
- 大小固定,修改成本高
- 基本类型数组可避免装箱开销
2. 列表(List)
Kotlin区分可变(mutable)和不可变(immutable)列表:
val immutable = listOf(1, 2, 3) // 只读列表
val mutable = mutableListOf(1, 2, 3) // 可变列表// 常用操作
val filtered = immutable.filter { it > 1 } // 过滤
val combined = immutable + listOf(4,5) // 拼接
mutable.add(4) // 修改
最佳实践:
- 默认使用不可变列表保证线程安全
- 需要修改时再转为可变列表
toMutableList()
3. 栈和队列
Kotlin推荐使用ArrayDeque
实现栈和队列:
// 栈实现
val stack = ArrayDeque<Int>().apply {push(1) // 压栈push(2)pop() // 弹栈
}// 队列实现
val queue = ArrayDeque<Int>().apply {add(1) // 入队add(2)poll() // 出队
}
二、键值对数据结构
1. 映射(Map)
val immutableMap = mapOf("a" to 1, "b" to 2)
val mutableMap = mutableMapOf("a" to 1)// 优雅操作
val value = immutableMap.getOrDefault("c", 0)
val transformed = immutableMap.mapValues { (k,v) -> "$k:$v" }
特性对比:
实现方式 | 特点 |
---|---|
HashMap | 快速访问,无序 |
LinkedHashMap | 保持插入顺序 |
TreeMap | 自动按键排序 |
2. 属性委托(Property Delegation)
Kotlin特有的属性存储方式:
var token: String by Delegates.observable("") { _, old, new -> println("$old → $new")
}
三、树形结构
1. 二叉树实现示例
class TreeNode<T>(val value: T) {var left: TreeNode<T>? = nullvar right: TreeNode<T>? = null// 中序遍历fun traverseInOrder(action: (T) -> Unit) {left?.traverseInOrder(action)action(value)right?.traverseInOrder(action)}
}
2. 红黑树应用
Kotlin的TreeMap
和TreeSet
底层采用红黑树实现:
val sortedMap = TreeMap<Int, String>().apply {put(3, "c")put(1, "a")
} // 自动保持键排序
四、函数式数据结构
1. 序列(Sequence)
惰性求值的集合操作:
val result = (1..1_000_000).asSequence().filter { it % 2 == 0 }.map { it * 2 }.take(10).toList()
与集合操作对比:
- 不创建中间集合,内存效率更高
- 适合大数据集处理
- 终端操作触发实际计算
2. 不可变持久化数据结构
通过persistent
集合实现:
val persistentMap = persistentMapOf("a" to 1)
val newMap = persistentMap.put("b", 2) // 创建新版本
五、性能对比
常用数据结构时间复杂度:
操作 | 数组 | 链表 | HashMap | TreeMap |
---|---|---|---|---|
访问 | O(1) | O(n) | O(1) | O(log n) |
插入/删除 | O(n) | O(1) | O(1) | O(log n) |
搜索 | O(n) | O(n) | O(1) | O(log n) |
六、选择指南
- 需要索引访问 → 数组/ArrayList
- 频繁插入删除 → LinkedList
- 快速查找 → HashSet/HashMap
- 需要排序 → TreeSet/TreeMap
- 函数式处理 → Sequence
- 线程安全 → 不可变集合
Kotlin通过扩展函数为所有数据结构添加了丰富的操作API:
list.associateWith { it.length } // 转为Map
set.union(otherSet) // 集合运算
map.maxBy { it.value } // 聚合操作