我正在做一个Scala项目,但我对这门语言相当陌生,尽管如此,我确实有Java背景。我发现Scala不支持Java的ArrayList类,因此我想知道Scala的等价物是什么;而且,如果有这样一个等价物,我想知道Java和Scala版本的类之间是否有任何重要的区别。
**编辑:**我不是在寻找一个特定的行为,而是一个内部的表现:数据存储在一个数组中,但以这样一种方式,整个数组是不可见的,除了你使用的部分。
vaqhlq811#
我能想到三个更具体的问题来回答你的问题:
ArrayList
Array
这些问题的答案如下:
Scala与Java的List接口的等价物是Seq。还有一个更通用的接口,即GenSeq--主要区别在于GenSeq可以串行或并行处理操作,具体取决于实现。因为Scala允许程序员使用Seq作为工厂,所以他们通常不会费心定义特定的实现,除非他们关心它。当他们这样做时,他们通常会选择Scala的List或Vector。它们都是不可变的,并且Vector具有良好的索引访问性能。另一方面,List做得很好。
List
Seq
GenSeq
Vector
这就是scala.collection.mutable.ArrayBuffer。
scala.collection.mutable.ArrayBuffer
好消息是,你可以在Scala中使用Array!在Java中,Array通常被避免使用,因为它与泛型不兼容。它是一个协变集合,而泛型是不变的,它是可变的--这使得它的协变是一个危险,它接受泛型不接受的原语,它有一个非常有限的方法集。在Scala中,Array--它仍然是Java中的Array--是不变的,这使得大多数问题都消失了。Scala接受AnyVal(原语的等价物)作为其“泛型”的类型,即使它会自动装箱。通过“丰富我的库”模式,Array可以使用ALLSeq方法。所以,如果你想要一个更强大的Array,只需使用Array。
AnyVal
所有集合可用的默认方法都生成 new 集合。例如,如果我这样做:
val ys = xs filter (x => x % 2 == 0)
然后ys将是一个 new 集合,而xs仍然与此命令之前相同。无论xs是什么,这都是真的:Array、List等当然,这是有代价的--毕竟,你正在制作一个新的收藏。Scala的不可变集合在处理这种开销方面要好得多,因为它们是持久化的,但这取决于执行的操作。没有一个集合可以对filter做太多的事情,但是List在通过前置元素或删除头部来生成新集合方面具有出色的性能-事实上,这是堆栈的基本操作。Vector在很多操作上都有很好的性能,但只有在集合不小的情况下才值得。比如说,对于多达100个元素的集合,总成本可能会超过收益。所以你可以在Array中添加或删除元素,Scala会为你生成一个 newArray,但是你需要支付一个完整副本的费用。Scala可变集合添加了一些其他的方法。特别是,可以增加或减少大小(而不产生新集合)的集合实现了Growable和Shrinkable特征。虽然它们不能保证这些操作的良好性能,但它们会将您指向要 checkout 的集合。
ys
xs
filter
Growable
Shrinkable
rks48beu2#
从scala.collection.mutable到ArrayBuffer。你可以找到scaladocs here。
scala.collection.mutable
ArrayBuffer
osh3o9ms3#
很难说你应该做什么,因为你还没有说你对使用ArrayList的什么行为感兴趣。考虑你想利用scala的哪些特性会更有用。这里有一个很好的解释:http://grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html。也就是说,你可能想要某种IndexedSeq。
IndexedSeq
3条答案
按热度按时间vaqhlq811#
我能想到三个更具体的问题来回答你的问题:
ArrayList
的特性?Array
的好替代品是什么?这些问题的答案如下:
Scala的默认集合是什么?
Scala与Java的
List
接口的等价物是Seq
。还有一个更通用的接口,即GenSeq
--主要区别在于GenSeq
可以串行或并行处理操作,具体取决于实现。因为Scala允许程序员使用
Seq
作为工厂,所以他们通常不会费心定义特定的实现,除非他们关心它。当他们这样做时,他们通常会选择Scala的List
或Vector
。它们都是不可变的,并且Vector
具有良好的索引访问性能。另一方面,List
做得很好。什么Scala集合具有类似
ArrayList
的特性?这就是
scala.collection.mutable.ArrayBuffer
。Scala中
Array
的替代品是什么?好消息是,你可以在Scala中使用
Array
!在Java中,Array
通常被避免使用,因为它与泛型不兼容。它是一个协变集合,而泛型是不变的,它是可变的--这使得它的协变是一个危险,它接受泛型不接受的原语,它有一个非常有限的方法集。在Scala中,
Array
--它仍然是Java中的Array
--是不变的,这使得大多数问题都消失了。Scala接受AnyVal
(原语的等价物)作为其“泛型”的类型,即使它会自动装箱。通过“丰富我的库”模式,Array
可以使用ALLSeq
方法。所以,如果你想要一个更强大的
Array
,只需使用Array
。那一个不断缩小和增长的收藏呢?
所有集合可用的默认方法都生成 new 集合。例如,如果我这样做:
然后
ys
将是一个 new 集合,而xs
仍然与此命令之前相同。无论xs
是什么,这都是真的:Array
、List
等当然,这是有代价的--毕竟,你正在制作一个新的收藏。Scala的不可变集合在处理这种开销方面要好得多,因为它们是持久化的,但这取决于执行的操作。
没有一个集合可以对
filter
做太多的事情,但是List
在通过前置元素或删除头部来生成新集合方面具有出色的性能-事实上,这是堆栈的基本操作。Vector
在很多操作上都有很好的性能,但只有在集合不小的情况下才值得。比如说,对于多达100个元素的集合,总成本可能会超过收益。所以你可以在
Array
中添加或删除元素,Scala会为你生成一个 newArray
,但是你需要支付一个完整副本的费用。Scala可变集合添加了一些其他的方法。特别是,可以增加或减少大小(而不产生新集合)的集合实现了
Growable
和Shrinkable
特征。虽然它们不能保证这些操作的良好性能,但它们会将您指向要 checkout 的集合。rks48beu2#
从
scala.collection.mutable
到ArrayBuffer
。你可以找到scaladocs here。osh3o9ms3#
很难说你应该做什么,因为你还没有说你对使用
ArrayList
的什么行为感兴趣。考虑你想利用scala的哪些特性会更有用。这里有一个很好的解释:http://grahamhackingscala.blogspot.com/2010/02/how-to-convert-java-list-to-scala-list.html。也就是说,你可能想要某种
IndexedSeq
。