kotlin中的list set map整理

在 Kotlin 中,ListSetMap 是三种核心集合类型,它们分别适用于不同的场景,具有独特的特性和操作方式。以下是它们的详细对比与使用指南:


1. List(列表)

核心特性

有序 :元素按插入顺序存储。

可重复 :允许存在相同值的元素。

索引访问 :通过下标(get(index)[index])快速访问元素。

分类

不可变列表List<T>,创建后不可修改。

kotlin 复制代码
val immutableList = listOf("A", "B", "C")

可变列表MutableList<T>,支持增删改。

kotlin 复制代码
val mutableList = mutableListOf(1, 2, 3)
mutableList.add(4) // [1, 2, 3, 4]
常用操作
方法 说明 示例
size 获取元素数量 list.size → 3
get(index) 获取指定位置元素 list[0] → "A"
indexOf(element) 查找元素首次出现的索引 list.indexOf("B") → 1
subList(from, to) 截取子列表 list.subList(1, 3) → ["B", "C"]
map { ... } 转换每个元素 list.map { it.length } → [1, 1, 1]
filter { ... } 过滤符合条件的元素 list.filter { it > "B" } → ["C"]
适用场景

• 需要保留元素顺序(如时间序列数据)。

• 允许重复值(如购物车商品列表)。

• 通过索引快速访问(如分页数据)。


2. Set(集合)

核心特性

无序 :元素存储顺序不固定。

唯一性 :元素不可重复(自动去重)。

快速存在性检查:基于哈希表或树结构优化查询效率。

分类

不可变集合Set<T>

kotlin 复制代码
val immutableSet = setOf("A", "B", "A") // 实际存储 ["A", "B"]

可变集合MutableSet<T>

kotlin 复制代码
val mutableSet = mutableSetOf(1, 2)
mutableSet.add(3) // [1, 2, 3](具体顺序可能变化)
实现类对比
类型 底层实现 特性
HashSet 哈希表 默认实现,高效查找,无序
LinkedHashSet 链表+哈希表 保持插入顺序
TreeSet 红黑树 元素按自然顺序排序
常用操作
方法 说明 示例
contains(element) 检查元素是否存在 set.contains("A") → true
union(otherSet) 取并集 set1.union(set2) → 合并后的集合
intersect(otherSet) 取交集 set1.intersect(set2) → 共同元素
minus(element) 移除指定元素 set.minus("A") → 新集合不包含 "A"
适用场景

• 需要去重的数据集(如用户ID集合)。

• 快速判断元素是否存在(如屏蔽词过滤)。

• 集合运算(如权限交集、并集)。


3. Map(映射)

核心特性

键值对存储 :每个元素由键(Key)和值(Value)组成。

键唯一性 :键不可重复,值可以重复。

快速键查找:基于键的哈希或树结构优化查询。

分类

不可变映射Map<K, V>

kotlin 复制代码
val immutableMap = mapOf(1 to "A", 2 to "B")

可变映射MutableMap<K, V>

kotlin 复制代码
val mutableMap = mutableMapOf(1 to "A")
mutableMap[2] = "B" // {1="A", 2="B"}
实现类对比
类型 底层实现 特性
HashMap 哈希表 默认实现,高效查找,无序
LinkedHashMap 链表+哈希表 保持插入顺序或访问顺序
TreeMap 红黑树 键按自然顺序排序
常用操作
方法 说明 示例
keys / values 获取所有键或值 map.keys → [1, 2]
get(key) 根据键获取值 map[1] → "A"
getOrDefault(key, default) 安全获取值(避免空指针) map.getOrDefault(3, "Unknown") → "Unknown"
put(key, value) 添加或更新键值对 map.put(3, "C") → {1="A", 2="B", 3="C"}
remove(key) 删除指定键的条目 map.remove(2) → {1="A"}
适用场景

• 键值关联数据(如用户信息表,键为用户ID)。

• 快速通过键访问值(如缓存系统)。

• 需要键排序的场景(如排行榜按分数排序)。


三者的对比总结

特性 List Set Map
元素唯一性 允许重复 唯一 键唯一,值可重复
顺序性 有序 无序(LinkedHashSet 除外) 无序(LinkedHashMap/TreeMap 除外)
访问方式 索引 存在性检查 键查找
典型实现类 ArrayList, LinkedList HashSet, TreeSet HashMap, TreeMap
内存开销 较低 较高(需存储哈希结构) 最高(键值对存储)

高级技巧

  1. 集合转换

    kotlin 复制代码
    val list = listOf(1, 2, 2, 3)
    val set = list.toSet()       // 去重 → [1, 2, 3]
    val map = list.associateWith { it * 10 } // {1=10, 2=20, 3=30}
  2. 空安全操作

    kotlin 复制代码
    val nullableList: List<Int>? = null
    val safeSize = nullableList?.size ?: 0 // 避免空指针
  3. 链式操作

    kotlin 复制代码
    val result = listOf("apple", "banana")
        .filter { it.length > 5 }
        .map { it.uppercase() }
        .toSet() // {"BANANA"}

通过合理选择 ListSetMap,可以高效解决数据存储和检索需求,同时利用 Kotlin 丰富的扩展函数简化代码逻辑。

相关推荐
A0微声z2 天前
Kotlin Multiplatform (KMP) 中使用 Protobuf
kotlin
alexhilton2 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
lhDream2 天前
Kotlin 开发者必看!JetBrains 开源 LLM 框架 Koog 快速上手指南(含示例)
kotlin
RdoZam2 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin
Kapaseker3 天前
研究表明,开发者对Kotlin集合的了解不到 20%
android·kotlin
郑州光合科技余经理3 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1233 天前
matlab画图工具
开发语言·matlab
dustcell.3 天前
haproxy七层代理
java·开发语言·前端
norlan_jame3 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone3 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc