我正在Scala中做一个项目,但是对于该语言来说还很新,并且具有Java背景。我看到Scala没有ArrayList,所以我想知道Scala相当于Java的ArrayList是什么,以及Java和Scala版本之间是否有重要区别。
编辑: 我不是在寻找一种特定的行为,而是在内部表示(数据存储在数组中,但是整个数组不可见,只有您使用的部分)。
我正在Scala中做一个项目,但是对于该语言来说还很新,并且具有Java背景。我看到Scala没有ArrayList,所以我想知道Scala相当于Java的ArrayList是什么,以及Java和Scala版本之间是否有重要区别。
编辑: 我不是在寻找一种特定的行为,而是在内部表示(数据存储在数组中,但是整个数组不可见,只有您使用的部分)。
Answers:
我可以想到3个更具体的问题来解决您的问题:
ArrayList
?Array
Scala?因此,这是这些的答案:
Scala与JavaList
接口等效Seq
。还存在一个更通用的接口,这是GenSeq
-主要区别在于GenSeq
,根据实现的不同,a可以串行或并行处理操作。
因为Scala允许程序员Seq
用作工厂,所以除非他们关心它,否则他们通常不必费心定义一个特定的实现。当他们这样做时,他们通常会选择ScalaList
或Vector
。它们都是不可变的,并且Vector
具有良好的索引访问性能。另一方面,List
操作得很好。
ArrayList
?那会是scala.collection.mutable.ArrayBuffer
。
Array
Scala?好吧,好消息是,您可以Array
在Scala中使用!在Java中,Array
由于与泛型一般不兼容,因此通常避免使用。它是一个协变量集合,而泛型是不变的,它是可变的-这使其协变成为一种危险,它接受泛型没有的原语,并且它的方法集非常有限。
在Scala中(Array
与Array
Java相同)是不变的,这使大多数问题都消失了。Scala接受AnyVal
(等效于基本体)作为其“泛型”的类型,即使它会进行自动装箱。并通过“丰富我的图书馆”模式,所有的Seq
方法可用来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
特性。但是,它们不能保证这些操作的良好性能,但是会为您指出要检出的集合。
ArrayList
速度比快3倍LinkedList
。我不得不减少N
使其在线运行。随着N = 50000000
我自己的机器上,ArrayList
大约是10倍的速度比LinkedList
。您在计算机上得到什么结果?如果LinkedList
速度更快,我会感到非常惊讶,因为它每次插入(时间)需要更多分配,并且每个元素都需要一个额外的Node对象(空间)。
ArrayList
每次重新分配大小时,其大小都会增加一倍,这意味着最多最多可以进行元素复制的两倍,换句话说,每个元素平均要复制两次。就是说,无论您增加阵列多少。作为回报,您将获得更有效的数据结构,具有更好的局部性和缓存特性。链接列表几乎永远不会更快。如果你从来没有需要查找的元素,你永远需要遍历数据结构,那么一个链表可能会更快。除此以外?号
ArrayList
将平时还是比较快的,因为它是较少的分配,间接更少,更好的内存位置。请记住,插入列表的中间位置需要您反复查找中间位置。对于链表,这要慢得多。经验法则是:“对于某些事情,显然ArrayList
更快。对于其他事情,令人惊讶的ArrayList
是更快”。:)
ArrayList
(或任何其他动态数组数据结构)几乎没有随机访问。从硬件的角度来看,这几乎是一个巨大的优势,无论您对数据结构执行哪种操作
很难确切地说出应该做什么,因为您还没有说出ArrayList
您对使用哪种行为感兴趣。考虑要利用哪些scala特性,这会更有用。这是一个很好的解释:http : //grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html。
也就是说,您可能需要某种IndexedSeq
。