Kotlin常用集合

Kotlin 常用集合类型分为有序线性集合(List)、无序唯一性集合(Set)和键值映射集合(Map),每种类型均包含只读和可变两种实现。以下为详细分类及核心特性说明:

一、List 集合

  1. 基础特性

    • 有序集合,支持索引访问元素,允许重复值。
    • 不可变集合通过 listOf() 创建,可变集合通过 mutableListOf()ArrayList 实现‌12。
  2. 常用操作

  • 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)
}
  1. 遍历方式

    • 常规循环: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 集合

  1. 基础特性

    • 无序集合,元素唯一,无索引概念。
    • 不可变集合通过 setOf() 创建,可变集合通过 mutableSetOf()LinkedHashSet 实现‌34。
  2. 常用操作

  • 可变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)
}
  1. 性能特点

    • HashSet 提供高效查找(O(1)),但无序;LinkedHashSet 保留插入顺序‌47。

三、Map 集合

  1. 基础特性

    • 键值对集合,键唯一,值可重复。
    • 不可变集合通过 mapOf() 创建,可变集合通过 mutableMapOf()HashMap 实现‌34。
  2. 常用操作

  • 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"))
}
  1. 遍历方式

    • 键值对遍历:map.forEach { (key, value) -> ... }
    • 单独访问键/值:keysvalues 属性‌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

六、注意事项

  1. 不可变集合初始化后不可修改,可变集合操作需注意线程安全‌35。
  2. 使用 to 关键字简化 Map 键值对声明(如 1 to "A")‌34。
  3. 优先使用标准库函数(如 filtermap)进行集合操作,提升代码简洁性‌
相关推荐
沅霖1 小时前
Android: Handler 的用法详解
android
鸿蒙布道师1 小时前
鸿蒙NEXT开发数值工具类(TS)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
Yang-Never3 小时前
Open GL ES ->GLSurfaceView在正交投影下的图片旋转、缩放、位移
android·开发语言·kotlin·android studio·贴图
粤M温同学3 小时前
使用Android 原生LocationManager获取经纬度
android
stevenzqzq3 小时前
Android Hilt 教程
android
CYRUS_STUDIO3 小时前
Frida Stalker Trace 指令跟踪&寄存器变化监控
android·逆向·汇编语言
bst@微胖子3 小时前
Flutter之设计与主题&字体
android·flutter
深圳之光5 小时前
增加android 禁用相机后摄的接口
android·数码相机
小胖子情白6 小时前
《x嘟牛App登录认证机制的技术实现分析》
android