这更多是关于样式和偏好的问题,但是这里有一些建议:我应该什么时候使用scala.Array?我经常使用List,偶尔用到Seq、Map之类的东西,但是从未使用过或见过实际的Array。它是否只是为了与Java兼容而存在?我是否错过了常见的用例?
Array
试图同时成为Java Array
和Scala Collection。它大多成功了,但在某些边缘情况下会失败。不幸的是,这些边缘情况可能发生在编写正常代码的好人身上,因此Scala 2.8正在改变这种情况。Array
类型的Array
。这意味着它是一个连续的内存空间,可以存储引用或原始值(因此可能具有不同的元素大小),并且可以快速随机访问。它也有糟糕的方法,可怕的toString
实现,并且在同时使用泛型和原始类型时性能表现不佳(例如:def f[T](a: Array[T]) = ...; f(Array(1,2,3))
)。GenericArray
的Scala Collection,由Array
支持。它始终存储装箱的原始类型,因此当混合使用原始类型和泛型时,它没有性能问题,但另一方面,它没有纯粹的原始(非泛型)原始数组的性能提升。Array
具有以下特征:
[T <: AnyRef]
,因此排除了原始类型,即AnyVal
,并且这些特性对于您的代码是最佳的,则使用它。GenericArray
。此外,如果您想要一个真正的Collection,带有所有方法,您可能也想使用它,而不是依赖于隐式转换。当您有许多相同(或兼容)类的项目,并且您事先知道这些项目的确切数量或合理的上限,并且您对快速随机访问和可能的原地更改感兴趣时,数组是适当的选择,但设置完成后,您将永远不会在列表中的某个位置插入或删除项目。
换句话说,它是一种聚合数据结构,比Collection类型少了些花哨,开销略小,性能略优,具体取决于使用方式。
一个非常牵强的例子:您从事函数生产业务,质量测试涉及检查1000个固定输入值的性能或结果。此外,您决定不将这些值保存在文件中,而是将它们硬编码到程序中。数组是适当的选择。
与Java API的接口是一个例子。与Java数组不同,Scala数组是不变的,因此在这方面与列表没有任何优势。