两个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.
我认为,第一个更有效:它实际上从右到左,并且将元素添加到列表实际上非常便宜,就像创建案例类的新实例一样便宜: def ::(x: T) = new scala.collection.immutable.::(x, this)
另一种方式实际上是一个varargs调用,所以,它首先创建一个新数组,并将所有变量放在那里,然后将其包装成a Seq,然后执行Seq.toList,最后通过类似(但更多参与/昂贵)的追加方式这个元素一个Seq接一个地到一个新的列表.
因此,第一种方式更有效,但我怀疑差异实际上是可以在任何类型的代码中检测到,您可以实际手动输入.