代码之家  ›  专栏  ›  技术社区  ›  osk

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

  •  2
  • osk  · 技术社区  · 8 年前

    我理解这两者背后的基本概念,但我想知道哪种结构最适合用于实现最佳复杂性。

    是您简单使用的普遍共识 Array 当您知道要创建的结构的长度时 ArrayBuffer 长度未知时?

    然而,让我困惑的是 大堆 对于内置Scala类型(如 Int , String 等等这是否也适用于您只需启动 Array[Int] 然后使用 :+= 还是只有当它有固定的长度时?

    我假设,如果您知道长度未知,并且使用的数据类型不是内置数据类型,那么最好的解决方案是 阵列缓冲器 ,但我不确定何时使用内置的。

    如果你有一个矩阵呢 Array[Array[Int]] . 如果要使用向其中添加行,这是最理想的吗 :+= ? 或者如果是那样的话 ArrayBuffer[Array[Int]] ?

    2 回复  |  直到 8 年前
        1
  •  2
  •   tuxdna    8 年前

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

    有关详细信息,请阅读以下帖子:

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

        2
  •  1
  •   puhlen    8 年前

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

    然而,令我困惑的是,声明数组对于Int、String等内置Scala类型更有效

    数组在处理AnyVal类型时要好得多,所以 Int , Long , Float , Double , Boolean , Byte , Short , Char . 这不适用于 String 或任何其他AnyRef类型。这是因为通常在将基元用作泛型类型时,它们需要装箱到对象包装器中,但使用数组时则不需要。

    这在Java中更为明显,在Java中,装箱和未装箱的原语有不同的类型,但装箱也发生在Scala中,这会产生很大的不同。

    推荐文章