簡體   English   中英

scala中數組和列表的區別

[英]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)

因此,除非您需要快速隨機訪問,需要對元素進行計數,或者出於某種原因需要破壞性更新,否則ListArray

Array 是可變的,這意味着您可以更改每個索引的值,而 List(默認情況下)是不可變的,這意味着每次進行修改時都會創建一個新列表。 在大多數情況下,使用不可變數據類型是一種更“功能性”的風格,您可能應該嘗試使用具有yieldforeachmatch等結構的 List 。

對於性能特征,隨機訪問元素時 Array 更快,而在添加(添加)新元素時 List 更快。 迭代它們是可比的。

數組是可變的,它的內容可以更新,而在 List 的情況下則不然。

val arr = Array[String]("one","hello","world")
 val list = List[String]("one","hello","world")

 arr(0) = ("two") // posible
 list(0) = "two" // Not allowed , scala compiler will not allow

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM