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