2017-08-23 36 views
0

這兩個List構造在編譯/內存佔用方面是否等價?Scala List鏈式運算符vs列表構造函數

val list1 = x1 :: x2 :: x3 :: Nil 
val list2 = List(x1, x2, x3) 

我覺得list1是更昂貴的,因爲每個h :: t創建一個列表,然後串接,直到最後列表中的每個新元素(導致一個新的列表)。 list2雖然一次性創建了一個列表。

+1

你假設'List(x1,x2,x3)'創建整個事情在一個鏡頭中是假的。你另外假設逐個建立一個List是無效的也是錯誤的。 'List'是一個鏈表,這意味着它是由鏈中相互連接的元素組成的。一個'List'對象實際上只是一個參考元素,因此您擔心的中間列表不會被丟棄,它們實際上是最終列表的一部分。 – puhlen

回答

4

我認爲,第一個是更有效:它實際上變爲從右到左,前置一個元素列表實際上是很便宜,便宜,因爲創建一個案例類的新實例:def ::(x: T) = new scala.collection.immutable.::(x, this)

另一種方式實際上是一個可變參數調用,因此,它首先創建一個新數組,然後將所有變量放在那裏,然後將其包裝到一個Seq中,然後執行Seq.toList,這最終會經歷類似的(但涉及更多/ )將Seq的元素逐一添加到新列表中。

因此,第一種方法更有效率,但我懷疑實際上可以在任何類型的手動輸入代碼中檢測到差異。