1. 概述
本文将介绍在 Kotlin 中初始化 Map
的几种常用方法。✅
核心内容包括:
- 使用
mapOf
创建不可变 Map - 使用
mutableMapOf
创建可变 Map - 使用
hashMapOf
、sortedMapOf
、linkedMapOf
创建特定实现的 Map
这些方法属于 Kotlin 标准库中集合操作的一部分,简洁高效,是日常开发中高频使用的技巧。⚠️ 掌握它们有助于写出更地道的 Kotlin 代码,避免踩坑 Java 风格的冗长写法。
相关接口文档参考:Map
2. 使用 mapOf 创建不可变 Map
最常用的初始化方式是使用 mapOf
工厂函数。它用于创建一个不可变的 Map
实例,并支持直接传入键值对。
val mapWithValues = mapOf("Key1" to "Value1", "Key2" to "Value2", "Key3" to "Value3")
✅ 类型推断在这里非常友好 —— 编译器能自动推导出 Map<String, String>
类型,无需显式声明。
但如果你要创建一个空的不可变 Map,则必须指定泛型类型:
val mapWithoutValues = mapOf<String, String>()
这与直接使用 emptyMap()
效果一致:
val emptyMap = emptyMap<String, String>()
❌ 注意:一旦创建,mapOf
返回的 Map 无法添加、修改或删除元素,否则会抛出 UnsupportedOperationException
。
3. 使用 mutableMapOf 创建可变 Map
当需要后续修改 Map 内容时,应使用 mutableMapOf
。它返回的是一个 MutableMap
,支持增删改操作。
创建空可变 Map 并赋值:
val emptyMutableMap = mutableMapOf<String, String>()
emptyMutableMap["Key"] = "Value"
也可以在初始化时传入初始数据:
val mutableMap = mutableMapOf("Key1" to "Value1", "Key2" to "Value2", "Key3" to "Value3")
mutableMap["Key3"] = "Value10" // 修改已有值
mutableMap["Key4"] = "Value4" // 新增条目
mutableMap.remove("Key1") // 删除键
✅ 这种方式灵活性高,适合配置缓存、动态参数收集等场景。
4. 使用 hashMapOf 创建 HashMap
若你明确希望底层使用 HashMap
实现(例如关注插入性能或兼容某些依赖 HashMap
特性的代码),可以使用 hashMapOf
。
val hashMap = hashMapOf("Key1" to "Value1", "Key2" to "Value2", "Key3" to "Value3")
hashMapOf
返回的是 Kotlin 封装的 HashMap
,本质是可变的。
因此你可以自由修改:
hashMap["Key3"] = "Value10" // 修改
hashMap["Key4"] = "Value4" // 新增
hashMap.remove("Key1") // 删除
⚠️ 虽然 mutableMapOf
在 JVM 上默认也返回 HashMap
实现,但使用 hashMapOf
更具语义清晰性,表明你确实依赖其具体行为(如非有序、允许 null 等)。
5. 使用 sortedMapOf 和 linkedMapOf 创建有序 Map
Kotlin 还提供了创建特定顺序 Map 的工厂函数,适用于对遍历顺序有要求的场景。
✅ sortedMapOf
创建一个按键排序的可变 SortedMap
(基于红黑树):
val sortedMap = sortedMapOf("Key3" to "Value3", "Key1" to "Value1", "Key2" to "Value2")
遍历时会按 key 的自然顺序输出:Key1
, Key2
, Key3
。
也可传入自定义 Comparator
控制排序逻辑。
✅ linkedMapOf
创建一个 LinkedHashMap
,保持插入顺序:
val linkedMap = linkedMapOf("Key3" to "Value3", "Key1" to "Value1", "Key2" to "Value2")
遍历时顺序与插入一致:Key3 → Key1 → Key2
。
非常适合用于实现 LRU 缓存或需要保留操作顺序的上下文。
💡 提示:虽然
mutableMapOf
在大多数情况下返回LinkedHashMap
,但这是实现细节,不应依赖。若需保证插入顺序,请显式使用linkedMapOf
。
6. 总结
Kotlin 提供了丰富的 Map 初始化手段,开发者可根据需求选择最合适的方式:
方法 | 是否可变 | 顺序特性 | 典型用途 |
---|---|---|---|
mapOf |
❌ 不可变 | 无保证 | 常量配置、只读数据 |
mutableMapOf |
✅ 可变 | 通常为插入顺序 | 通用可变映射 |
hashMapOf |
✅ 可变 | 无顺序 | 明确需要 HashMap 行为 |
linkedMapOf |
✅ 可变 | 插入顺序 | 记录操作顺序、LRU 缓存 |
sortedMapOf |
✅ 可变 | 键排序 | 需要有序遍历的场景 |
✅ 最常用的是 mapOf
和 mutableMapOf
,简洁且符合大多数业务场景。
对于遗留系统或特殊需求(如序列化兼容、性能敏感路径),建议使用具体类型构造函数以增强可读性和控制力。
所有示例代码均可在 GitHub 获取:Baeldung Kotlin Tutorials - Collections