我正在做一个 Scala 的项目,但是我对这门语言相当陌生,并且有 Java 背景。我看到 Scala 没有 ArrayList,所以我想知道 Scala 等价于 Java 的 ArrayList 被称为什么,以及 Java 和 Scala 版本之间是否有重要的区别。
编辑: 我不是在寻找一个特定的行为,而是在寻找一个内部表示(数据存储在一个数组中,但是整个数组是不可见的,只能看到你使用的部分)。
这是 scala.collection.mutable中的 ArrayBuffer你可以找到那个 Scaladocs 给你。
scala.collection.mutable
ArrayBuffer
很难准确地说出您应该做什么,因为您还没有说出您感兴趣使用的 ArrayList的什么行为。更有用的方法是考虑您想要利用哪些 scala 特性。这里有一个很好的解释: http://grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html。
ArrayList
也就是说,你可能需要某种 IndexedSeq。
IndexedSeq
我可以想出三个更具体的问题来回答你的问题:
Array
这些问题的答案如下:
Scala 相当于 Java 的 List接口是 Seq。还有一个更通用的接口,即 GenSeq——主要的区别在于,根据实现的不同,GenSeq可能有串行或并行处理的操作。
List
Seq
GenSeq
因为 Scala 允许程序员使用 Seq作为工厂,他们通常不会费心定义特定的实现,除非他们关心它。当他们这样做的时候,他们通常会选择 Scala 的 List或者 Vector。它们都是不可变的,并且 Vector具有良好的索引访问性能。另一方面,List能很好地执行它所执行的操作。
Vector
那就是 scala.collection.mutable.ArrayBuffer。
scala.collection.mutable.ArrayBuffer
好消息是,你可以在 Scala 中使用 Array!在 Java 中,通常避免使用 Array,因为它与泛型不兼容。它是一个协变集合,而泛型是不变的,它是可变的——这使它的协变成为一种危险,它接受泛型不接受的原语,并且它的方法集非常有限。
在 Scala 中,Array——仍然是 Java 中的 Array——是不变的,这使得大多数问题消失了。Scala 接受 AnyVal(相当于原语)作为其“泛型”的类型,即使它将进行自动装箱。通过“丰富我的库”模式,Seq方法中的 全部可用于 Array。
AnyVal
所以,如果你想要一个更强大的 Array,只要使用一个 Array。
所有集合可用的默认方法都生成 新的集合。例如,如果我这样做:
val ys = xs filter (x => x % 2 == 0)
然后 ys将是一个 新的集合,而 xs将仍然与以前的命令相同。无论 xs是什么都是正确的: Array、 List等等。
ys
xs
当然,这是有成本的——毕竟,您 是生产一个新的集合。Scala 的不可变集合在处理这个开销方面要好得多,因为它们是 坚持不懈,但这取决于执行什么操作。
没有一个集合可以对 filter做很多事情,但是 List在通过预置元素或删除头部(实际上是堆栈的基本操作)来生成新集合方面具有出色的性能。Vector在很多操作上都有很好的性能,但是只有在集合不小的情况下才有效。例如,对于多达100个元素的集合,总成本可能超过收益。
filter
因此,实际上可以向 Array添加或删除元素,而 Scala 将为您生成一个 新的 Array,但是在这样做时,您将支付完整副本的成本。
Scala 可变集合添加了一些其他方法。特别是,可以增加或减少大小(而不产生新的集合)的集合实现了 Growable和 Shrinkable特性。但是,它们不能保证这些操作具有良好的性能,但是它们会将您指向您想要检查的集合。
Growable
Shrinkable