Scala List链式cons运算符vs List构造函数

Pol*_*ase 1 scala

两个List构造在编译/内存占用方面是否相同?

val list1 = x1 :: x2 :: x3 :: Nil
val list2 = List(x1, x2, x3)
Run Code Online (Sandbox Code Playgroud)

我认为list1更昂贵,因为每个h :: t创建一个List,然后连接每个新元素(产生一个新列表)直到最终列表.同时list2创建一个List.

Dim*_*ima 7

我认为,第一个更有效:它实际上从右到左,并且将元素添加到列表实际上非常便宜,就像创建案例类的新实例一样便宜: def ::(x: T) = new scala.collection.immutable.::(x, this)

另一种方式实际上是一个varargs调用,所以,它首先创建一个新数组,并将所有变量放在那里,然后将其包装成a Seq,然后执行Seq.toList,最后通过类似(但更多参与/昂贵)的追加方式这个元素一个Seq接一个地到一个新的列表.

因此,第一种方式更有效,但我怀疑差异实际上是可以在任何类型的代码中检测到,您可以实际手动输入.