Kotlin 集合框架:List、Set、Map 数据结构解析与实战
Kotlin 强大的集合框架提供了 List、Set 和 Map 三种基础数据结构,以实现高效、灵活的数据管理。本教程将深入浅出地讲解这三种结构,并通过丰富示例展示其应用场景和最佳实践。
一、List:有序可重复元素集合
List 用于存储有序元素序列,元素可以重复出现。Kotlin 提供了 ArrayList
和 LinkedList
两种常用实现,分别适合不同的使用场景:
- ArrayList: 底层基于数组实现,访问元素速度快,但插入和删除操作较慢。
- LinkedList: 底层基于链表实现,插入和删除操作快,但访问元素速度慢。
1.1 创建 List
// 使用可变列表
val mutableList = mutableListOf(1, 2, 3, 4)
// 使用不可变列表
val immutableList = listOf(1, 2, 3, 4)
// 使用自定义类型
val nameList = listOf("Alice", "Bob", "Charlie")
1.2 常用操作
- 添加元素:
add
,addAll
- 删除元素:
remove
,removeAll
,removeAt
- 访问元素:
get
,indexOf
,lastIndexOf
- 遍历元素:
forEach
,for
循环 - 其他操作:
size
,isEmpty
,contains
,sort
,filter
,map
等
示例:
fun main() {
val numbers = mutableListOf(1, 2, 3, 4, 5)
// 添加元素
numbers.add(6)
// 删除元素
numbers.remove(3)
// 访问元素
println("第一个元素:${numbers[0]}")
// 遍历元素
numbers.forEach { println(it) }
// 过滤元素
val evenNumbers = numbers.filter { it % 2 == 0 }
println("偶数:$evenNumbers")
}
1.3 使用场景
- 需要存储有序元素序列,例如:用户操作历史记录、排行榜排名。
- 需要频繁访问元素,例如:缓存数据、数据库记录。
二、Set:无序不可重复元素集合
Set 用于存储无序元素集合,元素不能重复出现。Kotlin 提供了 HashSet
和 LinkedHashSet
两种常用实现:
- HashSet: 基于哈希表实现,添加、删除和查找元素速度快,但元素顺序不固定。
- LinkedHashSet: 基于链表实现,元素顺序按照添加顺序排列,但性能略低于
HashSet
。
2.1 创建 Set
// 使用可变集合
val mutableSet = mutableSetOf(1, 2, 3, 4)
// 使用不可变集合
val immutableSet = setOf(1, 2, 3, 4)
// 使用自定义类型
val fruitSet = setOf("Apple", "Banana", "Orange")
2.2 常用操作
- 添加元素:
add
,addAll
- 删除元素:
remove
,removeAll
- 判断元素是否存在:
contains
- 遍历元素:
forEach
,for
循环 - 其他操作:
size
,isEmpty
,union
,intersect
,subtract
等
示例:
fun main() {
val fruits = mutableSetOf("Apple", "Banana", "Orange")
// 添加元素
fruits.add("Strawberry")
// 删除元素
fruits.remove("Banana")
// 判断元素是否存在
println("集合中是否包含 Apple: ${fruits.contains("Apple")}")
// 遍历元素
fruits.forEach { println(it) }
// 求交集
val commonFruits = fruits.intersect(setOf("Apple", "Grape"))
println("交集:$commonFruits")
}
2.3 使用场景
- 需要存储唯一元素,例如:用户 ID 列表、网站访问日志。
- 需要快速判断元素是否存在,例如:词典、数据库索引。
三、Map:键值对集合
Map 用于存储键值对,每个键对应一个值。Kotlin 提供了 HashMap
和 LinkedHashMap
两种常用实现:
- HashMap: 基于哈希表实现,查找和插入操作速度快,但元素顺序不固定。
- LinkedHashMap: 基于链表实现,元素顺序按照添加顺序排列,但性能略低于
HashMap
。
3.1 创建 Map
// 使用可变映射
val mutableMap = mutableMapOf("name" to "Alice", "age" to 25)
// 使用不可变映射
val immutableMap = mapOf("name" to "Alice", "age" to 25)
// 使用自定义类型
val personMap = mapOf(
"Alice" to Person("Alice", 25),
"Bob" to Person("Bob", 30)
)
3.2 常用操作
- 添加键值对:
put
,putAll
- 获取值:
get
,getValue
- 删除键值对:
remove
,removeAll
- 判断键是否存在:
containsKey
- 判断值是否存在:
containsValue
- 遍历键值对:
forEach
,for
循环 - 其他操作:
size
,isEmpty
,keys
,values
等
示例:
fun main() {
val personData = mutableMapOf("name" to "Alice", "age" to 25)
// 添加键值对
personData["address"] = "New York"
// 获取值
println("姓名:${personData["name"]}")
// 判断键是否存在
println("是否存在地址:${personData.containsKey("address")}")
// 遍历键值对
personData.forEach { (key, value) -> println("$key: $value") }
}
3.3 使用场景
- 需要存储键值对数据,例如:用户配置文件、数据库记录。
- 需要快速查找特定值,例如:索引、字典。
四、扩展函数与泛型
Kotlin 提供了丰富的扩展函数,可以方便地操作集合。例如:
filter
: 过滤集合元素。map
: 将集合元素转换为其他类型。reduce
: 对集合元素进行累加操作。sortedBy
: 根据指定属性对集合元素进行排序。
Kotlin 还支持泛型,可以创建通用的集合类型,并根据需要传递具体的类型参数。例如:
fun <T> printCollection(collection: Collection<T>) {
collection.forEach { println(it) }
}
fun main() {
val numbers = listOf(1, 2, 3)
printCollection(numbers)
val names = listOf("Alice", "Bob", "Charlie")
printCollection(names)
}
五、总结
Kotlin 集合框架提供了强大的工具,可以帮助开发者高效地管理数据。通过合理选择数据结构,以及使用扩展函数和泛型,可以编写更简洁、可读性更强的代码。
更多资源:
- Kotlin官方文档: https://kotlinlang.org/docs/collections-overview.html
- Kotlin官方集合教程: https://kotlinlang.org/docs/collections.html
希望本教程能够帮助您更好地理解和使用 Kotlin 集合框架。