在 Scala 中,Map 是一种键值对(Key-Value)的集合,分为不可变 Map(默认,scala.collection.immutable.Map)和可变 Map(scala.collection.mutable.Map)。以下是 Map 的核心操作详解:
1. Map 的定义和创建
不可变 Map(默认)
直接使用Map(键->值, ...)创建,默认不可修改。
scala
// 方式1:使用 -> 符号
val map1: Map[String, Int] = Map("a" -> 1, "b" -> 2, "c" -> 3)
// 方式2:使用元组(键值对)
val map2 = Map(("x", 10), ("y", 20))
// 空Map
val emptyMap: Map[Nothing, Nothing] = Map.empty
可变 Map
需显式导入scala.collection.mutable.Map:
scala
import scala.collection.mutable.Map
// 创建可变Map
val mutableMap: Map[String, Int] = Map("a" -> 1, "b" -> 2)
val emptyMutableMap = Map.empty[String, Int]
2. 添加元素
不可变 Map
不可变 Map 添加元素会生成新 Map,原 Map 不变:
scala
val map = Map("a" -> 1)
val newMap = map + ("b" -> 2, "c" -> 3) // 多元素用括号包裹
println(newMap) // Map(a -> 1, b -> 2, c -> 3)
可变 Map
直接修改原 Map(+=或put):
scala
val map = Map("a" -> 1)
map += ("b" -> 2) // 添加单个元素
map += (("c", 3), ("d", 4))// 添加多个元素
map.put("e", 5) // 使用put方法
println(map) // Map(a -> 1, b -> 2, c -> 3, d -> 4, e -> 5)
3. 查询元素
通过键查询
scala
val map = Map("a" -> 1, "b" -> 2)
// 方式1:直接用键(无此键会抛异常)
val value1 = map("a") // 1
// map("c") // 抛出NoSuchElementException
// 方式2:get方法(返回Option,安全)
val value2 = map.get("b") // Some(2)
val value3 = map.get("c") // None
// 方式3:getOrElse(无键时返回默认值)
val value4 = map.getOrElse("c", 0) // 0
检查键 / 值是否存在
scala
map.contains("a") // true(检查键)
map.values.exists(_ == 2) // true(检查值)
4. 删除元素
不可变 Map
删除元素生成新 Map:
scala
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)
val newMap = map - "a" // 删除单个键
val newMap2 = map - ("b", "c")// 删除多个键
println(newMap) // Map(b -> 2, c -> 3)
可变 Map
直接修改原 Map(-=或remove):
scala
val map = Map("a" -> 1, "b" -> 2)
map -= "a" // 删除单个键
map -= ("b", "c") // 删除多个键(c不存在则忽略)
map.remove("b") // 使用remove方法
println(map) // Map()
5. 遍历 Map
遍历键值对
scala
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)
// 方式1:遍历元组(key, value)
for ((k, v) <- map) println(s"键:$k,值:$v")
// 方式2:foreach
map.foreach { case (k, v) => println(s"$k -> $v") }
遍历键或值
scala
// 遍历键
for (k <- map.keys) println("键:" + k)
// 或 map.keySet.foreach(println)
// 遍历值
for (v <- map.values) println("值:" + v)
排序遍历
scala
// 按键排序
map.toSeq.sortBy(_._1).foreach { case (k, v) => println(s"$k -> $v") }
// 按值排序
map.toSeq.sortBy(_._2).foreach { case (k, v) => println(s"$k -> $v") }
总结
- 不可变 Map:操作生成新 Map,线程安全,默认推荐使用。
- 可变 Map:直接修改原 Map,需显式导入,适合频繁修改场景。
- 核心操作:增(
+/+=)、删(-/-=)、查(()/get/getOrElse)、遍历(for/foreach)。