与java.util.ArrayList等效的Scala

lo8azlld  于 7个月前  发布在  Scala
关注(0)|答案(3)|浏览(124)

我正在做一个Scala项目,但我对这门语言相当陌生,尽管如此,我确实有Java背景。我发现Scala不支持Java的ArrayList类,因此我想知道Scala的等价物是什么;而且,如果有这样一个等价物,我想知道Java和Scala版本的类之间是否有任何重要的区别。

**编辑:**我不是在寻找一个特定的行为,而是一个内部的表现:数据存储在一个数组中,但以这样一种方式,整个数组是不可见的,除了你使用的部分。

vaqhlq81

vaqhlq811#

我能想到三个更具体的问题来回答你的问题:

  • 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(原语的等价物)作为其“泛型”的类型,即使它会自动装箱。通过“丰富我的库”模式,Array可以使用ALLSeq方法。
所以,如果你想要一个更强大的Array,只需使用Array

那一个不断缩小和增长的收藏呢?

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

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

然后ys将是一个 new 集合,而xs仍然与此命令之前相同。无论xs是什么,这都是真的:ArrayList
当然,这是有代价的--毕竟,你正在制作一个新的收藏。Scala的不可变集合在处理这种开销方面要好得多,因为它们是持久化的,但这取决于执行的操作。
没有一个集合可以对filter做太多的事情,但是List在通过前置元素或删除头部来生成新集合方面具有出色的性能-事实上,这是堆栈的基本操作。Vector在很多操作上都有很好的性能,但只有在集合不小的情况下才值得。比如说,对于多达100个元素的集合,总成本可能会超过收益。
所以你可以在Array中添加或删除元素,Scala会为你生成一个 newArray,但是你需要支付一个完整副本的费用。
Scala可变集合添加了一些其他的方法。特别是,可以增加或减少大小(而不产生新集合)的集合实现了GrowableShrinkable特征。虽然它们不能保证这些操作的良好性能,但它们会将您指向要 checkout 的集合。

rks48beu

rks48beu2#

scala.collection.mutableArrayBuffer。你可以找到scaladocs here

osh3o9ms

osh3o9ms3#

很难说你应该做什么,因为你还没有说你对使用ArrayList的什么行为感兴趣。考虑你想利用scala的哪些特性会更有用。这里有一个很好的解释:http://grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html
也就是说,你可能想要某种IndexedSeq

相关问题