Scala 等价于 java.util.ArrayList

我正在做一个 Scala 的项目,但是我对这门语言相当陌生,并且有 Java 背景。我看到 Scala 没有 ArrayList,所以我想知道 Scala 等价于 Java 的 ArrayList 被称为什么,以及 Java 和 Scala 版本之间是否有重要的区别。

编辑: 我不是在寻找一个特定的行为,而是在寻找一个内部表示(数据存储在一个数组中,但是整个数组是不可见的,只能看到你使用的部分)。

60366 次浏览

这是 scala.collection.mutable中的 ArrayBuffer你可以找到那个 Scaladocs 给你

很难准确地说出您应该做什么,因为您还没有说出您感兴趣使用的 ArrayList的什么行为。更有用的方法是考虑您想要利用哪些 scala 特性。这里有一个很好的解释: http://grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html

也就是说,你可能需要某种 IndexedSeq

我可以想出三个更具体的问题来回答你的问题:

  • Scala 的默认集合是什么?
  • 什么样的 Scala 集合具有类似于 ArrayList的特征?
  • 在 Scala 中,什么是 Array的好替代品?

这些问题的答案如下:

Scala 的默认集合是什么?

Scala 相当于 Java 的 List接口是 Seq。还有一个更通用的接口,即 GenSeq——主要的区别在于,根据实现的不同,GenSeq可能有串行或并行处理的操作。

因为 Scala 允许程序员使用 Seq作为工厂,他们通常不会费心定义特定的实现,除非他们关心它。当他们这样做的时候,他们通常会选择 Scala 的 List或者 Vector。它们都是不可变的,并且 Vector具有良好的索引访问性能。另一方面,List能很好地执行它所执行的操作。

什么样的 Scala 集合具有类似于 ArrayList的特征?

那就是 scala.collection.mutable.ArrayBuffer

在 Scala 中,什么是 Array的好替代品?

好消息是,你可以在 Scala 中使用 Array!在 Java 中,通常避免使用 Array,因为它与泛型不兼容。它是一个协变集合,而泛型是不变的,它是可变的——这使它的协变成为一种危险,它接受泛型不接受的原语,并且它的方法集非常有限。

在 Scala 中,Array——仍然是 Java 中的 Array——是不变的,这使得大多数问题消失了。Scala 接受 AnyVal(相当于原语)作为其“泛型”的类型,即使它将进行自动装箱。通过“丰富我的库”模式,Seq方法中的 全部可用于 Array

所以,如果你想要一个更强大的 Array,只要使用一个 Array

那收藏缩小和增长的作品呢?

所有集合可用的默认方法都生成 新的集合。例如,如果我这样做:

val ys = xs filter (x => x % 2 == 0)

然后 ys将是一个 新的集合,而 xs将仍然与以前的命令相同。无论 xs是什么都是正确的: ArrayList等等。

当然,这是有成本的——毕竟,您 生产一个新的集合。Scala 的不可变集合在处理这个开销方面要好得多,因为它们是 坚持不懈,但这取决于执行什么操作。

没有一个集合可以对 filter做很多事情,但是 List在通过预置元素或删除头部(实际上是堆栈的基本操作)来生成新集合方面具有出色的性能。Vector在很多操作上都有很好的性能,但是只有在集合不小的情况下才有效。例如,对于多达100个元素的集合,总成本可能超过收益。

因此,实际上可以向 Array添加或删除元素,而 Scala 将为您生成一个 新的 Array,但是在这样做时,您将支付完整副本的成本。

Scala 可变集合添加了一些其他方法。特别是,可以增加或减少大小(而不产生新的集合)的集合实现了 GrowableShrinkable特性。但是,它们不能保证这些操作具有良好的性能,但是它们会将您指向您想要检查的集合。