Scala中的ArrayBuffer与ArrayBuilder

Ale*_*rev 32 scala

scala.collections.mutable.ArrayBuilder和scala.collections.mutable.ArrayBuffer有什么区别?例如,如果我需要构建一个可以使用的Array [Int],那么?是否存在任何性能差异,例如java.lang.StringBuffer和java.lang.StringBuilder?

axe*_*l22 44

ArrayBuilder是一个Builder,而构建器用于通过向它们添加元素来构造其他集合.通常不打算在客户端代码中直接使用构建器.

ArrayBufferBufferSeq- 缓冲区是可以有效附加元素的序列.序列带有很多辅助操作.

你可能需要一个ArrayBuffer.它旨在用作ArrayListJava中的替代品.的ArrayBuffer类是与所有像批量数据操作的完全供电的序列的集合foreach,map,filter,zip和朋友,不像ArrayBuilder其仅配备+=添加元素和result以获得在末尾阵列.

您可能更喜欢的一个地方ArrayBuilder是,当您为原始类型实例化它时Int,您关心性能.在这种情况下,ArrayBuilder变体专门用于不同的基元类型,并保持适当基元类型的基础数组,而ArrayBuffer总是在下面保存一个对象数组 - 您添加到它的每个基元都经历装箱.

要实例化数组缓冲区:

new ArrayBuffer[Int] // gives you an array buffer that will hold boxed integers
Run Code Online (Sandbox Code Playgroud)

要实例化数组构建器:

new ArrayBuilder.ofInt // gives you a manually specialized array builder that will hold real primitives
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.在我的情况下,似乎,我需要一个ArrayBuilder:我需要在while循环中添加元素到'某事',然后在数组中转换这个'某事'(它必须是一个数组,用于java互操作性).根据这些信息,这个"东西"应该是一个ArrayBuilder. (3认同)
  • 简短的回答是"Builder"是(半)内部类,适用于编写新集合类的人(无论是作为标准库的一部分还是对它的扩展). (2认同)

Aka*_*all 9

我计时并构建一个ArrayBuilder明显更快的数组:

ArrayBuffer:

real    0m40.348s
user    0m29.544s
sys 0m1.017s
Run Code Online (Sandbox Code Playgroud)

Array Builder:

real    0m8.392s
user    0m4.769s
sys 0m0.330s
Run Code Online (Sandbox Code Playgroud)

我的代码:

import scala.collection.mutable.{ArrayBuffer, ArrayBuilder}

object MyObject {
    def main(args: Array[String]) {

        for (i <- 0 until 100) {
            arrayBuilderMade
            // or arrayBufferMade

        }
    }

    def arrayBufferMade {

        var aBuffer = new ArrayBuffer[Int]()

        for (i <- 0 until 1000000) {
            aBuffer += i
        }

        println(aBuffer.toArray.length)
    }

    def arrayBuilderMade {

        var aBuilder = new ArrayBuilder.ofInt

        for (i <- 0 until 1000000) {
            aBuilder += i
        }

        println(aBuilder.result.length)
    }
}
Run Code Online (Sandbox Code Playgroud)

time scala my_code.scala
Run Code Online (Sandbox Code Playgroud)