在我阅读When should I choose Vector in Scala?时,无论是使用List
还是Vector
,问题都在Scala中得到与在Java中相同的答案:是否使用LinkedList
的问题或ArrayList
。您可能知道,答案是“在大多数情况下使用Vector
/ ArrayList
”。
但是,根据http://docs.scala-lang.org/tutorials/FAQ/collections,在Scala中,List
是Traversable
的最终默认实现。我想这不是Vector,因为“它来晚了”。
Vector
不是更显优势吗?IndexedSeq
设置为Seq
的默认实现,因此Vector
成为Traversable
的最终默认实现是不是有意义?答案 0 :(得分:2)
scala.mutable.Vector
基于trie structure,因此它在技术上比java.util.ArrayList
复杂得多。这种复杂性意味着一堆List
共享commong后缀可能比共享公共前缀的Vector
串更轻量级。
该属性在功能样式中意味着很多,在这种情况下,您经常会有很多操作需要收集并返回其修改后的副本,例如stack。附加到大型Vector
可以生成几个新对象,预先设置为List
- 始终为一个。
List
非常易于理解和推理。它只是::
或Nil
。
Vector
的实施几乎是隐藏的,它有"dirty" optimisations,可以通过seq extractors优先匹配,这是指隐藏的优化drops
随机haskell开发人员可能希望Stream
成为默认Seq
而不是List
。一些scalaz
爱好者 - 希望more some symmetric Sequence导出到std lib。
由于scala.Seq.apply
chosen newBuilder
implementation的结果,您无法根据List
更改ListBuffer
选项。但是,您可以编写自己的类似Seq
工厂,如
object Seq extends SeqFactory[Seq] {
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, Seq[A]] = ReusableCBF.asInstanceOf[GenericCanBuildFrom[A]]
def newBuilder[A]: Builder[A, Seq[A]] = new VectorBuilder[A]
}
总结:
scala.Seq.apply
到另一种通用类型。但是可以导入或创建名为Seq
的其他对象。我个人认为Vector(...)
形式比IndexedSeq(...)
更有用,更简洁。 List(...)
代替Seq(...)
或LinearSeq(...)
。
答案 1 :(得分:1)
"在大多数情况下使用Vector"回答你习惯于在java中,不在scala中,因为它是一种不同的语言,具有不同的模式,工具和最佳实践。
大多数结构和变量是不可变的,并且算法在顺序处理数据流方面大部分时间表达。考虑到这两个观察结果,必须得出结论,最适合大多数用例的集合实现实际上是链表,而不是随机访问集。
因此,对问题#3的简短回答是"不要做"。稍微长一点的版本是:明确。如果您认为您想在某个地方使用IndexedSeq
,请这样说:val seq = IndexedSeq(1,2,3)