什么时候应该使用Array,什么时候应该在Scala中使用ArrayBuffer?

时间:2018-01-09 10:25:49

标签: scala

我理解两者背后的基本概念,但我想知道最适合哪种结构以获得最佳复杂性。

普遍的共识是,当您知道正在创建的结构的长度时,只需使用Array,然后在长度未知时使用ArrayBuffer吗?

然而,让我感到困惑的是,Array表示Int对内置Scala类型(如StringArray[Int]等)更有效。这是否也适用于您只需启动:+=,然后使用ArrayBuffer向其添加值的用例,或仅在其具有固定长度时才会使用?

我认为如果您知道长度未知并且您使用的数据类型不是内置数据类型,那么最佳解决方案是Array[Array[Int]],但我不确定何时内置的数据类型使用。

如果你有一个矩阵怎么办,让我们说:+=。如果您要使用ArrayBuffer[Array[Int]]向其添加行,这是最优化的吗?或者也许在这种情况下它应该是$data['excel'] = Excel::load($path, function ($reader) { $reader->sheet(0, function ($sheet) { $sheet->setColumnFormat(["A" => "@"]); }); })->toArray();

2 个答案:

答案 0 :(得分:2)

Array和ArrayBuffer之间的差异归结为调整阵列存储大小的分摊成本。

有关详细信息,请阅读以下文章:

如果您可以提前确定数据的存储要求,那么Array将比ArrayBuffer更好,因为您不需要通过ArrayBuffer完成的簿记。

答案 1 :(得分:1)

一般情况下,当您需要固定大小的集合时,Array是首选,而当您需要从末尾添加或删除元素时,ArrayBuffer要好得多。

  

然而,令我困惑的是,声明Array对于内置的Scala类型(如Int,String等)更有效

在处理AnyVal类型时,数组要好得多,因此IntLongFloatDoubleBooleanByteShortChar。这不适用于String或任何其他AnyRef类型。这是因为通常当基元被用作泛型类型时,它们需要被装入对象包装器中,但是使用数组它们不需要。

这在Java中更为明显,其中Boxed和unboxed基元具有不同的类型,但拳击也在Scala中发生,并且它可以产生很大的不同。