Scala相当于java.util.ArrayList

时间:2011-11-27 17:13:53

标签: java scala arraylist

我正在Scala中做一个项目,但我对这门语言很新,并且有Java背景。我看到Scala没有ArrayList,所以我想知道Scala相当于Java的ArrayList被调用,以及Java和Scala版本之间是否有任何重要的区别。

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

4 个答案:

答案 0 :(得分:106)

我可以想到3个更具体的问题来解决你的问题:

  • 什么是Scala的默认收藏?
  • 哪些Scala集合具有与ArrayList类似的特征?
  • 什么是Scala中Array的最佳替代品?

以下是这些的答案:

什么是Scala的默认集合?

Scala相当于Java的List接口是Seq。还存在一个更通用的接口,即GenSeq - 主要区别在于GenSeq可能具有串行或并行处理的操作,具体取决于实现。

因为Scala允许程序员使用Seq作为工厂,所以除非他们关心它,否则他们通常不会为定义特定的实现而烦恼。当他们这样做时,他们通常会选择Scala的ListVector。它们都是不可变的,Vector具有良好的索引访问性能。另一方面,List可以很好地完成它所做的操作。

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

那将是scala.collection.mutable.ArrayBuffer

Scala中Array的替代品是什么?

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

在Scala中,Array - 与Java中的Array相同 - 是不变的,这使得大多数问题都消失了。 Scala接受AnyVal(相当于原语)作为其“泛型”的类型,即使它会进行自动装箱。通过“丰富我的图书馆”模式,Seq可以使用所有 Array方法。

因此,如果您想要更强大的Array,只需使用Array

收缩和增长的集合怎么样?

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

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

然后ys将成为集合,而xs仍将与此命令之前相同。无论xs是什么,都是如此:ArrayList等。

当然,这需要付出代价 - 毕竟, 正在生成一个新的集合。 Scala的不可变集合在处理此成本方面要好得多,因为它们是持久性,但它取决于执行的操作。

没有任何集合可以对filter做很多事情,但是List通过预先添加元素或删除头部 - 堆栈的基本操作来生成新集合时具有出色的性能事实上。 Vector在一系列操作中表现良好,但只有在集合不小时才会付出代价。对于最多一百个元素的集合,总成本可能会超过收益。

因此,您实际上可以向Array添加或删除元素,Scala会为您生成 Array,但您需要支付全部费用当你这样做时复制。

Scala可变集合添加了一些其他方法。特别是,可以增加或减少大小的集合 - 不生成新集合 - 实现GrowableShrinkable特征。但是,他们并不保证这些操作的良好表现,但是他们会指出你想要查看的收藏品。

答案 1 :(得分:20)

来自ArrayBuffer的{​​{1}}。你可以找到scaladocs here

答案 2 :(得分:0)

你看过ArraySeq吗?

答案 3 :(得分:0)

很难确切地说出你应该做什么,因为你还没有说过你对ArrayList你有兴趣使用什么行为。从你想要利用哪些scala特征的角度思考它会更有用。这是一个很好的解释:http://grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html

那就是说,你可能想要某种IndexedSeq