java - Scala 等效于 java.util.ArrayList

标签 java scala arraylist

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

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

最佳答案

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

  • Scala 的默认集合是什么?
  • 什么Scala集合有类似ArrayList的特点?
  • Scala 中的 Array 有什么好的替代品?

以下是这些问题的答案:

Scala 的默认集合是什么?

Scala 等效于 Java 的 List 接口(interface)是 Seq。还存在一个更通用的接口(interface),即 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 (相当于原语)作为其“泛型”的类型,即使它会进行自动装箱。并且通过“丰富我的库”模式,SeqALL 方法可用于 Array

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

如何缩小和增长的集合?

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

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

那么 ys 将是一个 new 集合,而 xs 仍将与此命令之前相同。无论 xs 是什么都是如此:ArrayList

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

filter 没有任何集合可以做很多事情,但是 List 在通过添加元素或删除头部来生成新集合方面具有出色的性能 - 的基本操作一个堆栈,事实上。 Vector 在一堆操作上都有很好的表现,但只有在集合不小的情况下才有意义。例如,对于多达一百个元素的集合,总成本可能会超过 yield 。

所以你实际上可以在 Array 中添加或删除元素,Scala 会为你生成一个 new Array,但你会这样做时要支付完整副本的费用。

Scala 可变集合添加了一些其他方法。特别是,可以增加或减少大小的集合——不产生新集合——实现Growable。和 Shrinkable特征。不过,它们并不能保证这些操作的良好性能,但它们会为您指出要检查的集合。

关于java - Scala 等效于 java.util.ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287360/

相关文章:

java - 将流和收集器与 Maps 的 ArrayList 一起使用时出现不兼容类型错误

java - 在 JpaRepository 的查询中执行 PostGIS 函数

带有 scala setAdapter InvocationTargetException 的 Android

java - 从java中的列表中获取值

scala - 关于访问 Tuple2 中的字段时出错

scala - 将未经身份验证的请求发送到不同的操作路由

java - 比较 ArrayList 与 boolean 值

java - 可选的 jDBI 参数

java - 程序在编译器中运行良好,但在 jar 中运行不佳(Java)

java - 如何检查字符串相似度