这是一个比较普遍的问题,但我想知道使用Array
和ArraySeq
有什么优势。根据我所看到的,Array
是Scala对Java Array
的表示,其API成员不是很多,而ArraySeq
似乎包含更丰富的API。
实际上,你可以从四个不同的类中选择来获取可变的类似数组的功能。
Array + ArrayOps
WrappedArray
ArraySeq
ArrayBuffer
Array
是一个普通的Java数组, 它是访问基本类型数组的低级别方式中最好的选择。它没有额外的开销。同时,由于隐式转换为ArrayOps
,它可以像Scala集合一样工作,获取底层数组,应用适当的方法,并在必要时返回一个新的数组。但是由于ArrayOps
未针对基元进行专门化,因此它很慢(总是与装箱/拆箱一样慢)。
WrappedArray
是一个普通的Java数组,但包含了所有Scala集合好处的封装。与ArrayOps
的区别在于,WrappedArray
返回另一个WrappedArray
——因此,您不必为每个操作反复重新创建ArrayOps
。在大量的Java交互中需要传递普通的Java数组,但在Scala方面需要方便地处理它们时使用。
ArraySeq
将其数据存储在普通的Java数组中,但不再存储原始类型数组;一切都是对象数组。这意味着在输入过程中原始类型会被装箱。如果您想多次使用原始类型,那么这实际上是方便的;因为已经存储了装箱副本,所以您只需要对其进行拆箱操作,而不必在每个泛型操作上执行装箱和拆箱操作。
ArrayBuffer
就像一个数组,但您可以向其中添加并删除元素。如果您已经使用了ArraySeq
,为什么不在此过程中获得更多的灵活性呢?
Array
是Java的Array
的直接表示,使用JVM上完全相同的字节码。Array[Int]
传递给某个Java类,则可以将其分配给类型为Array[Object]
的变量,然后尝试添加任何不是int
的内容时将抛出ArrayStoreException
。)
ArraySeq
现在很少使用,它更多地是来自Scala旧版本的历史遗物,这些版本对数组进行了不同的处理。由于您无论如何都必须处理装箱,因此几乎可以肯定,另一个集合类型更适合您的要求。Array
到ArrayOps
的隐式转换,Arrays具有与ArraySeq完全相同的API。Seq
:)ArraySeq
在输入时封装基元类型,并存储已封装的基元类型。而 Array
每次访问元素都需要进行封装。因此,Array
(通过 ArrayOps
的隐式转换)类似于封装了基元类型的视图,而ArraySeq
则是强制性的。如果您只遍历一次数组,则使用 Array
更好。如果要遍历多次,则使用 ArraySeq
更好。 - Rex Kerr