我可以想出 3 个更具体的问题来解决您的问题:
- 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 的 ALL 方法可供Array 使用。
所以,如果您想要更强大的Array,只需使用Array。
如何缩小和增长的集合?
所有集合可用的默认方法都产生新集合。例如,如果我这样做:
val ys = xs filter (x => x % 2 == 0)
那么ys 将是一个新 集合,而xs 仍将与此命令之前相同。不管xs 是什么:Array、List 等都是如此。
当然,这是有代价的——毕竟,您正在制作一个新系列。 Scala 的不可变集合在处理这种成本方面要好得多,因为它们是持久的,但这取决于执行的操作。
没有集合可以对filter 做很多事情,但是List 在通过添加元素或移除头部来生成新集合方面具有出色的性能——事实上,这是堆栈的基本操作。 Vector 在一堆操作上都有不错的表现,但只有在集合不小的情况下才值得。例如,对于多达一百个元素的集合,总成本可能会超过收益。
因此,您实际上可以向Array 添加或删除元素,Scala 将为您生成一个新的 Array,但您需要支付完整副本的费用那个。
Scala 可变集合添加了一些其他方法。特别是,可以增加或减少大小的集合——而不产生新集合——实现Growable 和Shrinkable 特征。不过,它们并不能保证这些操作的良好性能,但它们会为您指出要检查的集合。