Kotlin 常用集合类型分为有序线性集合(List)、无序唯一性集合(Set)和键值映射集合(Map),每种类型均包含只读和可变两种实现。以下为详细分类及核心特性说明:
一、List 集合
-
基础特性
- 有序集合,支持索引访问元素,允许重复值。
- 不可变集合通过
listOf()
创建,可变集合通过mutableListOf()
或ArrayList
实现12。
-
常用操作
- List创建与元素获取
scss
// 普通取值方式: 索引
// 防止奔溃取值方式: getOrElse getOrNull
fun main(){
//不可改变集合
val list:List<String> = listOf("Lisi","zhangshan","wangwu","zhaoliu")
println(list[0])
println(list[1])
println(list[2])
println(list[3])
println(list[4])
println(list.getOrElse(3){"你越界了"})
println(list.getOrElse(4){"你越界了"})
println(list.getOrElse(5){"你越界了"})
println(list.getOrNull(5))
}
- 可变List
kotlin
// 可变的集合
// 不可变集合 to 可变集合
// 可变集合 to 不可变集合
fun main(){
// 可变的集合
val list = mutableListOf("zhangshan","lisi","wangwu","zhaoliu")
list.add("张山")
list.add("李四")
list.remove("lisi")
println(list)
//不可变集合
val list1 = listOf("Lili", "Zhangsna", "Wangwu")
//不可变集合 变可变集合
val list2 = list1.toMutableList()
list2.add("张三")
list2.remove("Lili")
println(list2)
//可变集合 to 不可变集合
val list4: MutableList<Char> = mutableListOf('A', 'B', 'C')
list4.add('D')
list4.add('E')
list4.add('F')
val list5 = list4.toList()
// list5.add
// list5.remove
}
- mutator函数操作
kotlin
// 1.mutator += -= 操作
// 2.removeIf
fun main(){
val list1:MutableList<String> = mutableListOf("A","B","C","D")
list1 += "E"
list1 += "F"
list1 -= "A"
println(list1)
val list2:MutableList<String> = mutableListOf("GreenA","GreenB","GreenC","GreenD")
list2.removeIf { it.contains("Green") } // 过滤所有的元素,只要是有 Green 的元素,就是true 删除
println(list2)
}
-
遍历方式
- 常规循环:
for (item in list)
- 带索引遍历:
list.forEachIndexed { index, value -> ... }
38
- 常规循环:
- List集合遍历
kotlin
fun main(){
val list = listOf(1, 2, 3, 4, 5, 6, 7)
println(list) // 输出list详情而已,这个不是遍历集合
// 第一种 遍历方式:
for (i in list) {
print("元素:$i ")
}
println()
//第二种遍历方式
list.forEach {
print("元素:$it ")
}
//第三种遍历方式
list.forEachIndexed { index, i -> println("index:$index value:$i") }
}
- 解构语法过滤元素
kotlin
// 1.集合配合解构语法
// 2.反编译看Java给三个变量赋值的代码
// 3.解构屏蔽接收值
fun main(){
//1.
val list = listOf("李小龙","哪吒","孙大圣","关羽")
val(value1,value2, value3) = list
println("v1:$value1,v2:$value2,v3:$value3")
var(v1, v2, v3) = list
v1 = "OK"
println("v1:$v1, v2:$v2, v3:$v3")
// 用_内部可以不接收赋值,可以节约一点性能
var(_, v5, v6) = list
println("v5:$v5, v6:$v6")
}
二、Set 集合
-
基础特性
- 无序集合,元素唯一,无索引概念。
- 不可变集合通过
setOf()
创建,可变集合通过mutableSetOf()
或LinkedHashSet
实现34。
-
常用操作
- 可变Set集合
kotlin
fun main(){
val set : MutableSet<String> = mutableSetOf("李元霸", "李连杰")
set += "李俊"
set += "李天"
set -= "李连杰"
set.add("刘军")
set.remove("刘军")
println(set)
}
- 集合转换与快捷函数学习
scss
// 1.定义可变list集合
// 2.List 转 Set 去重
// 3.List 转 Set 转 List 也能去重
// 4.快捷函数去重 distinct
fun main(){
val list:MutableList<String> = mutableListOf("李小龙","哪吒","孙大圣","关羽")
list.add("李小龙")
list.add("哪吒")
println(list)
val set = list.toSet()
println(set)
val list1:MutableList<String> = mutableListOf("李小龙","哪吒","孙大圣","关羽")
list1 += "李小龙"
list1 += "哪吒"
val list2 = list1.toSet().toList()
println(list2)
val list3:MutableList<String> = mutableListOf("李小龙","哪吒","孙大圣","关羽")
list3 += "李小龙"
list3 += "哪吒"
println(list3)
// 快捷函数去重 distinct,但对list集合没有改变
println(list3.distinct()) // 内部做了:先转变成 可变的Set结合 在转换成 List集合
println(list3.toMutableSet().toList()) // 和上面代码等价
println(list3)
}
-
性能特点
HashSet
提供高效查找(O(1)),但无序;LinkedHashSet
保留插入顺序47。
三、Map 集合
-
基础特性
- 键值对集合,键唯一,值可重复。
- 不可变集合通过
mapOf()
创建,可变集合通过mutableMapOf()
或HashMap
实现34。
-
常用操作
- Map的创建方式
vbnet
val map:Map<String,Double> = mapOf("LiLei" to 12.2,"Lily" to 55.6)
val map1:Map<String,Double> = mapOf(Pair("LiLei",12.5),Pair("Lily",25.6))
- Map 的访问方式
scss
fun main(){
val map:Map<String,Double> = mapOf("Derry" to 12.2,"Lily" to 55.6)
val map1:Map<String,Double> = mapOf(Pair("Derry",12.5),Pair("Lily",25.6))
//第一种方式[]
println("1:[]方式")
println(map1["Derry"])
println(map1["Lily"])
println(map1["3"]) //返回null
//第二种方式
println("2:getOrDefault 方式")
println(map1.getOrDefault("Derry",99.9))
println(map1.getOrDefault("null",0.99))
//第三种方式
println("3:getOrElse 方式")
println(map1.getOrElse("Lily"){"没有此值"})
println(map1.getOrElse("null"){"没有此值"})
// 方式四 getValue 与Java一样 会奔溃 尽量不要使用此方式
println("4:get方式")
println(map1.getValue("Derry"))
// println(map.getValue("hello"))
}
-
遍历方式
- 键值对遍历:
map.forEach { (key, value) -> ... }
- 单独访问键/值:
keys
和values
属性38
- 键值对遍历:
kotlin
fun main(){
val map:Map<String,Double> = mapOf(Pair("zhangshan",10.1), Pair("lisi",10.2), Pair("wangwu",11.3))
//第一种方式
println("第一种方式")
map.forEach{
println("key: ${it.key} value:${it.value}")
}
println("第二种方式")
//第二种方式
map.forEach { k, v ->
println("k:$k value:$v")
}
println("第三种方式")
//第三种方式
for (itme in map){
println("key:${itme.key},value:${itme.value}")
}
println("第四种方式")
map.forEach{ key:String,value:Double ->
println("key: $key value:$value")
}
}
- 可变Map集合
scss
/ 1.可变集合的操作 += [] put
// 2.getOrPut 没有的情况
// 3.getOrPut 有的情况
fun main(){
val map:MutableMap<String,Int> = mutableMapOf("Derry" to 18,"LiLei" to 19,"zhangshan" to 16)
val mapPair:MutableMap<String,Int> = mutableMapOf(Pair("machao",11), Pair("zhaoyun",25), Pair("chaocao",85))
mapPair += Pair("liubei",53)
// mapPair -= Pair("machao",11)
mapPair.remove("machao")
map +=("Lisi" to 19)
// map -=("Derry" to 18)
map.remove("Derry")
map -= "Derry"
map["CCC"] = 888
println(map)
println(mapPair)
//getOrPut 没有的情况
map.getOrPut("mawu"){99}
println(map)
// 3.getOrPut 有的情况
map.getOrPut("Derry"){28}
println(map)
}
四、数组类型
scss
/*
Kotlin语言中的各种数组类型,虽然是引用类型,背后可以编译成Java基本数据类型
IntArray intArrayOf
DoubleArray doubleArrayOf
LongArray longArrayOf
ShortArray shortArrayOf
ByteArray byteArrayOf
FloatArray floatArrayOf
BooleanArray booleanArrayOf
Array<对象类型> arrayOf 对象数组
*/
// 1.intArrayOf 常规操作的越界奔溃
// 2.elementAtOrElse elementAtOrNull
// 3.List集合转 数组
// 4.arrayOf Array<File>
fun main(){
// 1.intArrayOf 常规操作的越界奔溃
val intArray = intArrayOf(1,2,3,4)
println(intArray.get(1))
println(intArray.get(2))
println(intArray.get(3))
// println(intArray.get(4))
// 2.elementAtOrElse elementAtOrNull
println(intArray.elementAtOrElse(1){999})
println(intArray.elementAtOrElse(2){999})
println(intArray.elementAtOrElse(3){999})
println(intArray.elementAtOrElse(4){999})
// OrNull + 空合并操作符 一起来用
intArray.elementAtOrNull(4)
println(intArray.elementAtOrNull(4))
println(intArray.elementAtOrNull(4) ?:"越界了")
// 3.List集合转 数组
val charArray /*: CharArray*/ = listOf('A', 'B', 'C').toCharArray()
println(charArray)
}
五、集合选择建议
集合类型 | 适用场景 | 性能要点 |
---|---|---|
List |
需要顺序访问或重复元素 | 索引访问高效(O(1)),查找低效(O(n))17 |
Set |
元素唯一性要求高 | HashSet 查找高效(O(1))48 |
Map |
键值映射关系 | 键哈希优化,快速检索值68 |
六、注意事项
- 不可变集合初始化后不可修改,可变集合操作需注意线程安全35。
- 使用
to
关键字简化Map
键值对声明(如1 to "A"
)34。 - 优先使用标准库函数(如
filter
、map
)进行集合操作,提升代码简洁性