Scala常用数据结构
2025年3月11日Scala 提供了丰富的数据结构支持,主要分为 不可变集合(Immutable Collections) 和 可变集合(Mutable Collections)。不可变集合是默认的设计选择,因为它们线程安全且更易于维护代码。以下是 Scala 中常用的数据结构及其特点、使用场景和示例。
1. 序列(Sequences)
1.1 List
- 不可变链表(immutable linked list)。
- 常用于需要频繁在头部追加元素的场景。
- 特点:
- 高效的头部操作(
O(1)
)。 - 适合递归操作。
- 随机访问性能较差(
O(n)
)。
- 高效的头部操作(
val list = List(1, 2, 3)
val newList = 0 :: list // 在头部添加元素
println(newList) // List(0, 1, 2, 3)
1.2 Vector
- 不可变序列,基于树状分块数组。
- 常用于需要高效随机访问和尾部操作的场景。
- 特点:
- 随机访问时间复杂度为
O(log32(n))
。 - 比
List
更适合大规模数据处理。
- 随机访问时间复杂度为
val vector = Vector(1, 2, 3)
val updatedVector = vector :+ 4 // 在尾部添加元素
println(updatedVector) // Vector(1, 2, 3, 4)
1.3 Array
- 可变数组,底层是 Java 的数组。
- 常用于需要高性能、固定大小的集合。
- 特点:
- 支持随机访问,时间复杂度为
O(1)
。 - 元素可以被修改。
- 支持随机访问,时间复杂度为
val array = Array(1, 2, 3)
array(0) = 10 // 修改元素
println(array.mkString(", ")) // 10, 2, 3
1.4 Range
- 表示一个范围的序列,通常用于迭代。
- 特点:
- 高效生成范围序列。
- 不占用额外内存。
val range = 1 to 10
println(range) // Range(1, 2, 3, ..., 10)
2. 集合(Sets)
2.1 Set
- 无序集合,默认是 不可变集合。
- 特点:
- 不允许重复元素。
- 提供高效的元素查找(基于哈希表)。
val set = Set(1, 2, 3, 3) // 不允许重复
println(set) // Set(1, 2, 3)
val newSet = set + 4 // 添加元素
println(newSet) // Set(1, 2, 3, 4)
2.2 Mutable Set
- 可变版本的
Set
。 - 特点:
- 允许直接修改集合。
import scala.collection.mutable
val mutableSet = mutable.Set(1, 2, 3)
mutableSet += 4 // 添加元素
println(mutableSet) // Set(1, 2, 3, 4)
3. 映射(Maps)
3.1 Map
- 键值对集合,默认是 不可变集合。
- 特点:
- 键是唯一的。
- 提供高效的键值映射查找。
val map = Map("a" -> 1, "b" -> 2)
println(map("a")) // 1
val newMap = map + ("c" -> 3) // 添加键值对
println(newMap) // Map(a -> 1, b -> 2, c -> 3)
3.2 Mutable Map
- 可变版本的
Map
。 - 特点:
- 允许直接修改键值对。
import scala.collection.mutable
val mutableMap = mutable.Map("a" -> 1, "b" -> 2)
mutableMap += ("c" -> 3) // 添加键值对
println(mutableMap) // Map(a -> 1, b -> 2, c -> 3)
4. 队列(Queues)
4.1 Queue
- 不可变队列。
- 特点:
- 先进先出(FIFO)结构。
- 适合需要按顺序处理元素的场景。
import scala.collection.immutable.Queue
val queue = Queue(1, 2, 3)
val (dequeued, newQueue) = queue.dequeue // 移除第一个元素
println(dequeued) // 1
println(newQueue) // Queue(2, 3)
4.2 Mutable Queue
- 可变版本的
Queue
。 - 特点:
- 允许直接修改队列。
import scala.collection.mutable
val mutableQueue = mutable.Queue(1, 2, 3)
mutableQueue.enqueue(4) // 添加元素
println(mutableQueue) // Queue(1, 2, 3, 4)
mutableQueue.dequeue() // 移除第一个元素
println(mutableQueue) // Queue(2, 3, 4)
5. 栈(Stacks)
5.1 Stack
- 可变栈。
- 特点:
- 后进先出(LIFO)结构。
- 常用于递归或需要回溯的场景。
import scala.collection.mutable
val stack = mutable.Stack(1, 2, 3)
stack.push(4) // 压栈
println(stack) // Stack(4, 1, 2, 3)
stack.pop() // 出栈
println(stack) // Stack(1, 2, 3)
6. 流(Streams)
- 惰性集合,类似于
List
,但元素是按需计算的。 - 适合处理无限序列或延迟计算场景。
val stream = Stream.from(1) // 从 1 开始的无限序列
println(stream.take(5).toList) // List(1, 2, 3, 4, 5)
7. 元组(Tuples)
- 用于存储固定数量的不同类型的元素。
- 特点:
- 元素可以是不同类型。
- 常用于函数返回多个值的场景。
val tuple = (1, "hello", true)
println(tuple._1) // 1
println(tuple._2) // hello
println(tuple._3) // true
8. Option
- 用于表示可能存在或不存在的值,避免
null
。 - 特点:
Some(value)
表示存在值。None
表示没有值。
val maybeValue: Option[Int] = Some(42)
println(maybeValue.getOrElse(0)) // 42
val noValue: Option[Int] = None
println(noValue.getOrElse(0)) // 0
总结

根据具体需求选择适合的 Scala 数据结构,可以大幅提高代码的性能和可维护性!