相当于java.util.ArrayList的Scala
我正在Scala做一个项目,但是对于这个语言来说还是比较新的,并且有一个Java背景。 我看到Scala没有ArrayList,所以我想知道Scala的什么样的Java ArrayList被调用,以及Java和Scala版本之间有什么重要的区别。
编辑:我不寻找一个特定的行为,以至于内部表示(数据存储在一个数组中,但整个数组不可见,只有你使用的部分)。
我可以想出三个更具体的问题来解决你的问题:
- 什么是Scala的默认collections?
- 什么Scala集合具有类似于
ArrayList
特征? - 什么是在斯卡拉
Array
的好替代?
所以这里是这些答案:
什么是Scala的默认collections?
Scala相当于Java的List
接口是Seq
。 还有一个更一般的接口,就是GenSeq
主要区别在于GenSeq
可能有串行或并行处理的操作,具体取决于实现。
因为Scala允许程序员使用Seq
作为工厂,所以除非他们关心它,否则他们通常不会去定义特定的实现。 当他们这样做的时候,他们通常会selectScala的List
或者Vector
。 它们都是不可变的, Vector
具有良好的索引访问性能。 另一方面, List
做得非常好。
什么Scala集合具有类似于ArrayList
特征?
这将是scala.collection.mutable.ArrayBuffer
。
什么是在斯卡拉Array
的好替代?
好消息是,你可以在Scala中使用Array
! 在Java中, Array
经常被避免,因为它与generics不兼容。 这是一个共同的变种集合,而generics是不变的,它是可变的 – 这使得它的变异成为一个危险,它接受generics不需要的原始types,而且它有一套相当有限的方法。
在Scala中, Array
与Java中的Array
一样是不变的,这使得大部分问题都消失了。 Scala接受AnyVal
(相当于原语)作为它的“generics”的types,即使它会做自动装箱。 通过“丰富我的库”模式, 所有 Seq
方法都可用于Array
。
所以,如果你想要一个更强大的Array
,只需使用一个Array
。
如何收缩和增长?
所有集合可用的默认方法都会产生新的集合。 例如,如果我这样做:
val ys = xs filter (x => x % 2 == 0)
那么ys
将会是一个新的集合,而xs
将会和之前的命令一样。 这是真的,不pipe是什么xs
: Array
, List
等
当然,这是一个成本 – 毕竟,你正在生产一个新的集合。 Scala的不可变集合在处理这个成本方面要好得多,因为它们是持久的 ,但是取决于执行什么操作。
没有一个集合可以做很多关于filter
事情,但是List
通过预先添加一个元素或者删除头部 – 一个堆栈的基本操作,在生成一个新的集合方面performance出色。 Vector
在一堆操作上有很好的performance,但是如果集合不小,它只会付出代价。 对于一百个元素的collections,总体成本可能会超过收益。
所以你可以添加或删除元素到一个Array
,而Scala会为你创build一个新的 Array
,但是当你这样做的时候,你会付出全部的代价。
Scala可变集合添加了其他一些方法。 尤其是,可以增加或减less尺寸的collections品 – 无需生产新的collections品 – 实现可Growable
和可Shrinkable
特性。 但是,他们并不能保证在这些操作上有良好的performance,但是他们会将您指向您想要查看的collections。
这是来自scala.collection.mutable
的ArrayBuffer
。 你可以在这里findscaladocs。
你有没有看过ArraySeq
?
很难说你应该做什么,因为你没有说你有兴趣使用ArrayList
行为。 想想你想利用哪个scala特性来思考更有用。 这是一个很好的解释: http : //grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html 。
也就是说,你可能想要某种IndexedSeq
。