[英]Difference between Array and List in scala
在什么情況下我應該使用 Array(Buffer) 和 List(Buffer)。 我知道的唯一一個區別是數組是非變量的,而列表是協變量的。 但是性能和其他一些特性呢?
Scala List
是一個不可變的遞歸數據結構,它是 Scala 中的一個基本結構,您(可能)應該(可能)使用它比Array
(實際上是可變的- Array
的不可變模擬是IndexedSeq
)更多地使用它。
如果您有 Java 背景,那么明顯的相似之處是何時使用LinkedList
不是ArrayList
。 前者通常用於只遍歷過(並且其大小預先未知)的列表,而后者應該用於具有已知大小(或最大大小)或快速隨機訪問很重要的列表。
ListBuffer
提供了到List
的恆定時間轉換,如果需要稍后的轉換,這就是使用ListBuffer
原因。
scala Array
應該由 Java 數組在 JVM 上實現,因此Array[Int]
可能比List[Int]
性能更高(作為int[]
)(它將裝箱其內容,除非您正在使用Scala 的最新版本,具有新的@specialized
功能)。
但是,我認為Array
s 在 Scala 中的使用應該保持在最低限度,因為感覺你真的需要知道幕后發生了什么來決定你的數組是否真的由所需的原始類型支持,或者可以作為包裝類型裝箱。
除了已經發布的答案之外,這里還有一些細節。
Array[A]
實際上是一個 Java 數組,而List[A]
是一個不可變的數據結構,它要么是Nil
(空列表),要么由一對(A, List[A])
。
性能差異
Array List
Access the ith element θ(1) θ(i)
Delete the ith element θ(n) θ(i)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Count the elements θ(1) θ(n)
內存差異
Array List
Get the first i elements θ(i) θ(i)
Drop the first i elements θ(n-i) θ(1)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
因此,除非您需要快速隨機訪問,需要對元素進行計數,或者出於某種原因需要破壞性更新,否則List
比Array
。
Array 是可變的,這意味着您可以更改每個索引的值,而 List(默認情況下)是不可變的,這意味着每次進行修改時都會創建一個新列表。 在大多數情況下,使用不可變數據類型是一種更“功能性”的風格,您可能應該嘗試使用具有yield
、 foreach
、 match
等結構的 List 。
對於性能特征,隨機訪問元素時 Array 更快,而在添加(添加)新元素時 List 更快。 迭代它們是可比的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.