我熟悉Java集合的实现,并试图了解如何在Scala中实现集合。
Scala的集合最终会包装Java集合吗?什么是ArrayList在Scala中的等价物?Java中的ArrayList包含一个包含数组*的变量elementData。这种实现在Scala中类似的类/特性中吗?Scala中的可增长集合是如何实现的?
太好了,亚历山大
*
发布于 2014-03-20 22:22:40
Scala集合有一个概述文件。
基本上,这些是直接用Scala编写的结构,而不是现有Java集合的包装器,尽管可以使用JavaConverters对象在Scala中包装Java集合。
Scala提倡不可变的数据结构,这些数据结构在涉及并发性时更容易推理,而标准的Java集合是可变的。java.util.ArrayList的通信可能是scala.collection.mutable.Buffer。默认的缓冲区实现是ArrayBuffer,它还使用内部可以动态增长的数组。
发布于 2014-03-20 22:22:49
1)不,Scala集合是独立于Java集合实现的。但是,有一种方法可以将Java集合包装到Scala集合接口,这样您就可以使用Scala来理解它们和它们上的其他方法。这里描述了从Scala转换到Java的旧方法,反之亦然。
现在,您可以按照链接中的描述导入JavaConversions,然后在集合上调用asJava或asScala,这取决于您需要哪个方向。
2) ArrayList在ArrayBuffer apply (Java get)、update (Java set)和+= (Javaadd)的复杂度方面与Java等价。
3) ArrayBuffer扩展了其他几个集合使用的ResizeableArray实用程序类。据我所知,该类中的私有数组字段称为array0,但操作它的逻辑与elementData相同。
ArrayBuffer的保证是摊销的O(1) +=方法,这意味着当基础数组需要调整为更大的数组时,只有偶尔更新才会花费O(n)。预置元素是一个O(n)操作,并将它们插入中间。
在ArrayBuffer操作中,底层数组永远不会缩小,即一旦数组缓冲区增长到一定大小,然后所有元素都被删除,它仍将占用相同数量的内存。即使您在上面调用clear,也是如此。
4)可增长集合是实现特征Growable的所有集合。此特性定义了向其添加元素的方法+=。该方法的确切语义取决于集合是集合(在这种情况下,元素是添加到集合)、序列还是链接集/映射(在这种情况下,元素之间有顺序,因此元素只是添加到末尾),还是其他的东西。如何实现可增长的集合取决于从一个集合到另一个集合。这是一个很好的Scala集合概述。
https://stackoverflow.com/questions/22546268
复制相似问题