元素如何存储在集合中?

时间:2014-03-20 22:13:20

标签: java scala arraylist

我熟悉Java集合的实现,我正在尝试了解如何在Scala中实现集合。

Scala的集合最终会包装Java集合吗? Scala中ArrayList的等价物是什么? Java中的ArrayList包含一个包含数组[*]的变量elementData。这个实现在Scala中的等效类/特性中是否相似?如何实现Scala中可扩展的集合?

亲切的问候, 亚历山大

[*] http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java

2 个答案:

答案 0 :(得分:2)

1)不,Scala集合是与Java集合分开实现的。但是,有一种方法可以将Java集合包装到Scala集合接口,以便您可以对它们使用Scala for-comprehensions和其他方法。 描述了从Scala转换为Java API的旧方法,反之亦然here

如今,您可以按照链接中的说明导入JavaConversions,然后根据您需要的方向调用集合上的asJavaasScala来执行此操作。

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,它也在内部使用一个可以动态增长的数组。