等价于java.util.ArrayList的Scala

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

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

我没有寻找一个特定的行为,如内部表示(数据存储在一个数组中,但整个数组不可见,只有你使用的部分)。

提问于
用户回答回答于

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

  • 什么是Scala的默认集合?
  • 斯卡拉收藏有哪些特征ArrayList
  • 什么是ArrayScala 的好替代?

所以这里是这些答案:

什么是Scala的默认集合?

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

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

有哪些特征ArrayList

那将是scala.collection.mutable.ArrayBuffer

什么是ArrayScala 的好替代?

好消息是,你可以Array在Scala中使用!在Java中,Array由于与泛型不兼容,通常会避免这种情况。它是一个共同变种集合,而泛型是不变的,它是可变的 - 这使得它的变异成为危险,它接受泛型不需要的原始类型,并且它有一套相当有限的方法。

在斯卡拉,Array它仍然和ArrayJava一样 - 是不变的,这使得大部分问题都消失了。斯卡拉接受AnyVal(相当于原语)作为其“泛型”类型,尽管它会进行自动装箱。并通过“丰富我的图书馆”模式,所有Seq方法可用来Array

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

如何缩小和增长的收藏?

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

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

然后ys将成为一个新的集合,但xs仍然会和之前的命令一样。这是真实的,不管是什么xs是:ArrayList,等。

当然,这是一个成本 - 毕竟,你正在制作一个新的系列。Scala的不可变集合在处理这个成本方面要好得多,因为它们是持久的,但它取决于执行的操作。

没有一个集合可以做很多事情filter,但List事实上,通过预先添加元素或删除头部 - 堆栈的基本操作,在生成新集合方面表现出色。Vector在一系列操作中表现出色,但只有收集量不小才能付出代价。对于比如说多达一百个元素的收藏,总体成本可能会超过收益。

所以你实际上可以添加或删除元素Array,而Scala会为你制作一个新的 元素Array,但是当你这样做时,你需要支付全部副本的费用。

Scala可变集合添加了一些其他方法。特别是,可以增加或减少大小集合-而不会产生一个新的集合-落实GrowableShrinkable特质。不过,他们并不能保证在这些操作上有良好的表现,但他们会将您指向您想要查看的收藏。

用户回答回答于

ArrayBuffer来自scala.collection.mutable。你可以在这里找到scaladocs 。

扫码关注云+社区