繁体   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