我熟悉Java集合的实现,我正在尝试了解如何在Scala中实现集合。
Scala的集合最终会包装Java集合吗? Scala中ArrayList的等价物是什么?
Java中的ArrayList包含一个包含数组[*]的变量elementData
。这个实现在Scala中的等效类/特性中是否相似?如何实现Scala中可扩展的集合?
亲切的问候, 亚历山大
答案 0 :(得分:2)
1)不,Scala集合是与Java集合分开实现的。但是,有一种方法可以将Java集合包装到Scala集合接口,以便您可以对它们使用Scala for-comprehensions和其他方法。 描述了从Scala转换为Java API的旧方法,反之亦然here。
如今,您可以按照链接中的说明导入JavaConversions
,然后根据您需要的方向调用集合上的asJava
或asScala
来执行此操作。
2)ArrayList
在Scala ArrayBuffer
(Java apply
),get
的复杂性方面等同于update
(Java {{1} }}和set
(Java +=
)。
3)add
扩展了其他几个集合使用的ArrayBuffer
实用程序类。据我所知,该类中的私有数组字段称为ResizeableArray
,但操作它的逻辑与array0
相同。
elementData
s保证摊销ArrayBuffer
O(1)
方法,这意味着只有在需要将基础数组调整为较大的数组时,才会偶尔更新+=
。
前置元素是一个O(n)
操作,并将它们插入中间。
在O(n)
操作中,底层数组永远不会收缩,即一旦数组缓冲区增长到一定大小,然后删除所有元素,它仍将占用相同数量的内存。即使您在其上调用ArrayBuffer
也是如此。
4)可扩展集合是实现特征clear
的所有集合。此特征定义了向其添加元素的方法Growable
。此方法的确切语义取决于集合是否是集合(在这种情况下,元素被添加到集合),序列或链接集合/映射(在这种情况下元素之间存在顺序,因此元素是只是添加到最后),或其他东西。
如何实现可增长的集合取决于从一个集合到另一个集合。这是一个很好的overview for Scala collections。
答案 1 :(得分:1)
Scala集合有overview document。
基本上这些是直接在Scala中编写的结构,而不是现有Java集合的包装,尽管可以使用JavaConverters
对象将Java集合包装在Scala API中。
Scala提倡不可变数据结构,当涉及并发时更易于推理,而标准Java集合是可变的。 java.util.ArrayList
的对应关系可能是scala.collection.mutable.Buffer
。默认缓冲区实现是ArrayBuffer
,它也在内部使用一个可以动态增长的数组。