向量是不可变的,索引的,支持随机访问,在Scala中高效;什么是不可变线性序列的需要列表?
答案 0 :(得分:4)
列表是一种非常常见的数据结构,如果它不存在则会很奇怪。
使用prepend,head和tail操作列表更好
与vector
相比,List的开销更少如果您不需要随机访问,只关心头/尾操作列表是有意义的。如果你确实需要随机访问,那么Vector或其他一些数据结构更有意义。
答案 1 :(得分:1)
Haoyi Li比较Scala系列有一个非常有趣的Blog。我向任何人推荐这个。
有一节明确比较了Lists vs Vectors。
总体而言,列表和向量具有完全不同的特征
答案 2 :(得分:0)
除了@marios和@puhlen已经提到的内容之外,使用传统列表(头/尾)的另一个原因是模式匹配。有两个类可以帮助解决这个问题。
首先是::
(cons)案例类:
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}
其次,有一个Nil
案例类:
case object Nil extends List[Nothing] {
...
}
(正如您可以看到这些都适用于List
类型)
这些使列表上的模式匹配非常自然:
list match {
case Nil => "empty list"
case x :: xs => s"head is $x with tail $xs"
}