Scala相当于java.util.ArrayList

ast*_*y13 64 java scala arraylist

我正在Scala中做一个项目,但我对这门语言很新,并且有Java背景.我看到Scala没有ArrayList,所以我想知道Scala相当于Java的ArrayList被调用,以及Java和Scala版本之间是否存在任何重要差异.

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

Dan*_*ral 108

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

  • 什么是Scala的默认收藏?
  • 什么Scala集合具有类似的特征ArrayList
  • Array在Scala中有什么好的替代品?

以下是这些的答案:

什么是Scala的默认收藏?

Scala相当于Java的List界面Seq.还存在更通用的接口,其GenSeq主要区别在于a GenSeq可能具有串行或并行处理的操作,具体取决于实现.

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

什么Scala集合具有类似的特征ArrayList

那就是scala.collection.mutable.ArrayBuffer.

Array在Scala中有什么好的替代品?

嗯,好消息是,你可以Array在Scala中使用!在Java中,Array由于其与泛型的一般不兼容性,因此经常被避免.它是一个共变量集合,而泛型是不变的,它是可变的 - 这使得它的协方差成为危险,它接受泛型不具有的原语,并且它具有非常有限的一组方法.

在Scala中,Array- 仍然与ArrayJava 相同- 是不变的,这使得大多数问题都消失了.Scala接受AnyVal(相当于原语)作为其"泛型"的类型,即使它会进行自动装箱.并通过"丰富我的图书馆"模式,所有Seq方法可用来Array.

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

收缩和成长的集合怎么样?

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

val ys = xs filter (x => x % 2 == 0)
Run Code Online (Sandbox Code Playgroud)

然后ys将是一个新的集合,同时xs仍然与此命令之前相同.这是真实的,不管是什么xs是:Array,List,等.

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

没有任何集合可以做很多事情filter,但是List通过预先添加元素或移除头部(事实上,堆栈的基本操作)来生成新集合具有出色的性能.Vector在一堆操作上具有良好的性能,但只有在集合不小时才会付出代价.对于最多一百个元素的集合,总体成本可能会超过收益.

因此,您实际上可以添加或删除元素Array,Scala将为您生成 Array内容,但是当您这样做时,您将支付完整副本的成本.

Scala可变集合添加了一些其他方法.特别是,可以增加或减少大小的集合 - 不生成新的集合 - 实现GrowableShrinkable特征.但是,它们并不能保证这些操作的良好性能,但是它们会指向您想要查看的集合.

  • [这里](http://ideone.com/7OyDRW)是一个在线测试,演示`ArrayList`比`LinkedList`快约3倍,尽管必要的重新分配.我不得不减少"N"以使其在线工作.在我自己的机器上使用`N = 50000000`,`ArrayList`比`LinkedList`快约10倍.你的机器有什么结果?如果`LinkedList`更快,我会感到非常惊讶,因为它需要每次插入更多的赋值(时间),并且每个元素都需要一个额外的Node对象(空间). (13认同)
  • @ DanielC.Sobral:[here](http://ideone.com/MSGL2E)是一个后续在线测试,显示`ArrayList`比`LinkedList`快12倍,适用于中间插入.`LinkedList`只在[在开头附近插入时]显示得更快(http://ideone.com/eDksfH). (7认同)
  • @DanielC.Sobral:增加一个`ArrayList`,每次重新分配时它的大小翻倍意味着你的副本最多只有元素的两倍 - 换句话说,平均来说,每个元素被复制*两次*.无论你如何增长阵列,那就是.作为回报,您可以获得更高效的数据结构,并具有更好的局部性和缓存特性.链表实际上*永远不会*更快.如果你*从不*需要查找元素,而你*永远不需要迭代数据结构,那么链表*可能会更快.除此以外?没有. (6认同)
  • @DanielC.Sobral:在这些情况下,`ArrayList`*通常*仍然会更快,因为它分配更少,间接更少,内存位置更好.请记住,插入列表中间*需要您迭代才能找到中间*.这对于链表来说要慢很多*.经验法则是"对于某些事情来说,很明显`ArrayList`更快.对于其他事情,令人惊讶的是'ArrayList`更快".:) (3认同)
  • 情况并非总是如此,但 CPU 和内存性能之间的差距已经变得非常大。随机内存访问非常慢,而链表是*所有*随机访问。“ArrayList”(或任何其他动态数组数据结构)实际上没有随机访问。从硬件的角度来看,几乎无论您对数据结构执行哪种操作,这都是一个*巨大的*优势 (2认同)

mis*_*tor 20

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