Map映射 #

一、Map 基础 #

1.1 创建 Map #

scala
val map1 = Map("a" -> 1, "b" -> 2, "c" -> 3)
val map2 = Map(("a", 1), ("b", 2), ("c", 3))
val map3 = Map.empty[String, Int]
val map4 = Map.fill(3)("key" -> 0)

1.2 Map 特点 #

  • 不可变(默认)
  • 键唯一
  • 键值对存储

1.3 基本访问 #

scala
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)

map("a")
map.apply("a")
map.get("a")
map.get("d")
map.getOrElse("d", 0)
map.keySet
map.values
map.toList

二、Map 操作 #

2.1 添加元素 #

scala
val map = Map("a" -> 1, "b" -> 2)

val map1 = map + ("c" -> 3)
val map2 = map + ("c" -> 3, "d" -> 4)
val map3 = map ++ Map("c" -> 3, "d" -> 4)
val map4 = map.updated("c", 3)

2.2 删除元素 #

scala
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)

val map1 = map - "a"
val map2 = map - ("a", "b")
val map3 = map -- List("a", "b")
val map4 = map.removed("a")

2.3 更新元素 #

scala
val map = Map("a" -> 1, "b" -> 2)

val map1 = map.updated("a", 10)
val map2 = map + ("a" -> 10)

三、常用方法 #

3.1 查找 #

scala
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)

map.get("a")
map.get("d")
map.getOrElse("d", 0)
map.getOrElseUpdate("d", 4)
map.find(_._2 > 1)
map.filter(_._2 > 1)
map.filterKeys(_ == "a")

3.2 检查 #

scala
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)

map.isEmpty
map.nonEmpty
map.contains("a")
map.keySet
map.values
map.keys

3.3 转换 #

scala
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)

map.map { case (k, v) => (k.toUpperCase, v * 2) }
map.mapValues(_ * 2)
map.transform((k, v) => s"$k: $v")
map.toList
map.toSeq
map.toSet

3.4 聚合 #

scala
val map = Map("a" -> 1, "b" -> 2, "c" -> 3)

map.size
map.values.sum
map.values.product
map.values.max
map.values.min
map.foldLeft(0) { case (acc, (_, v)) => acc + v }

3.5 分组 #

scala
val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

val grouped = list.groupBy(_ % 2)
val partitioned = list.partition(_ % 2 == 0)

四、可变 Map #

4.1 创建 mutable Map #

scala
import scala.collection.mutable

val map = mutable.Map("a" -> 1, "b" -> 2)
val empty = mutable.Map.empty[String, Int]

4.2 添加元素 #

scala
import scala.collection.mutable

val map = mutable.Map("a" -> 1)

map += ("b" -> 2)
map += ("c" -> 3, "d" -> 4)
map ++= Map("e" -> 5, "f" -> 6)
map.put("g", 7)
map("h") = 8

4.3 删除元素 #

scala
import scala.collection.mutable

val map = mutable.Map("a" -> 1, "b" -> 2, "c" -> 3)

map -= "a"
map -= ("b", "c")
map --= List("d", "e")
map.remove("f")
map.clear()

4.4 更新元素 #

scala
import scala.collection.mutable

val map = mutable.Map("a" -> 1, "b" -> 2)

map("a") = 10
map.update("b", 20)

4.5 getOrElseUpdate #

scala
import scala.collection.mutable

val map = mutable.Map("a" -> 1)

val value = map.getOrElseUpdate("b", 2)
println(value)
println(map)

五、Map 实现 #

5.1 HashMap #

默认实现,基于哈希表:

scala
val hashMap = scala.collection.immutable.HashMap("a" -> 1, "b" -> 2)

5.2 TreeMap #

有序映射,基于红黑树:

scala
import scala.collection.immutable.TreeMap

val treeMap = TreeMap("c" -> 3, "a" -> 1, "b" -> 2)
println(treeMap)

5.3 LinkedHashMap #

保持插入顺序:

scala
import scala.collection.mutable.LinkedHashMap

val linkedMap = LinkedHashMap("c" -> 3, "a" -> 1, "b" -> 2)
println(linkedMap)

5.4 ListMap #

基于列表的实现:

scala
import scala.collection.immutable.ListMap

val listMap = ListMap("c" -> 3, "a" -> 1, "b" -> 2)

六、Map 实战 #

6.1 词频统计 #

scala
def wordCount(text: String): Map[String, Int] =
  text.toLowerCase
    .split("\\s+")
    .filter(_.nonEmpty)
    .groupBy(identity)
    .map { case (word, occurrences) => word -> occurrences.length }

val text = "hello world hello scala world"
println(wordCount(text))

6.2 分组聚合 #

scala
case class Person(name: String, department: String, salary: Double)

val people = List(
  Person("Alice", "Engineering", 100000),
  Person("Bob", "Engineering", 90000),
  Person("Charlie", "Marketing", 80000),
  Person("David", "Marketing", 85000)
)

val byDepartment = people.groupBy(_.department)
val avgSalary = byDepartment.map { case (dept, employees) =>
  dept -> employees.map(_.salary).sum / employees.length
}

6.3 缓存实现 #

scala
import scala.collection.mutable

class Cache[K, V]:
  private val store = mutable.Map.empty[K, V]
  
  def get(key: K): Option[V] = store.get(key)
  
  def put(key: K, value: V): Unit = store.put(key, value)
  
  def getOrCompute(key: K)(compute: => V): V =
    store.getOrElseUpdate(key, compute)
  
  def remove(key: K): Option[V] = store.remove(key)
  
  def clear(): Unit = store.clear()

val cache = Cache[String, String]()
cache.put("key1", "value1")
println(cache.get("key1"))
println(cache.getOrCompute("key2") { "computed" })

6.4 多值 Map #

scala
import scala.collection.mutable

class MultiMap[K, V]:
  private val store = mutable.Map.empty[K, mutable.Set[V]]
  
  def add(key: K, value: V): Unit =
    store.getOrElseUpdate(key, mutable.Set.empty) += value
  
  def remove(key: K, value: V): Unit =
    store.get(key).foreach(_ -= value)
  
  def get(key: K): Set[V] =
    store.get(key).map(_.toSet).getOrElse(Set.empty)
  
  def removeKey(key: K): Unit =
    store.remove(key)

val multiMap = MultiMap[String, String]()
multiMap.add("fruit", "apple")
multiMap.add("fruit", "banana")
multiMap.add("fruit", "cherry")
println(multiMap.get("fruit"))

七、性能考虑 #

7.1 时间复杂度 #

操作 HashMap TreeMap
get O(1) O(log n)
put O(1) O(log n)
remove O(1) O(log n)
min/max key O(n) O(log n)

7.2 选择建议 #

场景 推荐
快速查找 HashMap
有序遍历 TreeMap
保持插入顺序 LinkedHashMap

八、总结 #

Map 操作速查 #

操作 方法
获取 apply, get, getOrElse
添加 +, ++, updated
删除 -, --, removed
键集合 keySet, keys
值集合 values
转换 map, mapValues, transform
过滤 filter, filterKeys

可变 vs 不可变 #

特性 不可变 Map 可变 Map
修改 返回新集合 原地修改
操作符 +, - +=, -=
更新 updated update, apply
线程安全

下一步,让我们学习 集合操作

最后更新:2026-03-27