首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >相当于java.util.ArrayList的Scala

相当于java.util.ArrayList的Scala
EN

Stack Overflow用户
提问于 2011-11-28 01:13:53
回答 3查看 55.8K关注 0票数 72

我正在用Scala做一个项目,但我对这门语言相当陌生,而且有Java背景。我发现Scala没有ArrayList,所以我想知道Scala与Java的ArrayList的等价物是什么,以及在Java和Scala版本之间是否有什么重要的区别。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-28 02:40:33

我可以想出3个更具体的问题来回答你的问题:

什么是Scala的默认collection?

  • What Scala集合,具有与ArrayList

  • What's相似的特征,是Scala中Array的一个很好的替代品?

以下是这些问题的答案:

Scala的默认集合是什么?

Seq是Scala的List接口的等价物。还有一个更通用的接口,那就是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即可。

一个缩水和增长的集合呢?

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

代码语言:javascript
复制
val ys = xs filter (x => x % 2 == 0)

那么ys将是一个新的集合,而xs仍将与此命令之前相同。无论xs是什么:ArrayList等等,这都是正确的。

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

任何集合都不能对filter做太多的事情,但是List在生成新集合时有很好的性能,可以通过在元素前面加上一个元素或者去掉头部--事实上,这是堆栈的基本操作。Vector在许多操作上都有很好的性能,但只有在集合不小的情况下,它才能获得回报。例如,对于多达100个元素的集合,总成本可能超过收益。

因此,您实际上可以向Array添加或删除元素,Scala将为您生成一个新的Array,但当您这样做时,您将支付完整副本的成本。

Scala可变集合添加了一些其他方法。具体地说,可以增加或减少大小的集合实现了GrowableShrinkable特征。虽然它们不能保证这些操作具有良好的性能,但它们会为您提供您想要检查的集合。

票数 114
EN

Stack Overflow用户

发布于 2011-11-28 01:18:14

我是scala.collection.mutableArrayBuffer。您可以找到scaladoc here

票数 23
EN

Stack Overflow用户

发布于 2011-11-28 01:21:49

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

也就是说,您可能需要某种IndexedSeq

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8287360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档