Scala中的ArrayBuffer与ArrayBuilder

时间:2013-04-05 17:04:15

标签: scala

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

2 个答案:

答案 0 :(得分:42)

ArrayBuilderBuilder,构建器用于通过向其添加元素来构建其他集合。通常不打算在客户端代码中直接使用构建器。

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

您可能需要ArrayBuffer。它旨在用作Java中ArrayList的替代。 ArrayBuffer类是一个完全强大的序列集合,包含foreachmapfilterzip和朋友等所有批量数据操作,与{{{1}不同1}}只配备ArrayBuilder添加元素,+=配置最后获取数组。

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

要实例化数组缓冲区:

ArrayBuffer

实例化数组构建器:

new ArrayBuffer[Int] // gives you an array buffer that will hold boxed integers

答案 1 :(得分:8)

我计时并且使用ArrayBuilder构建数组明显更快:

使用ArrayBuffer

real    0m40.348s
user    0m29.544s
sys 0m1.017s

使用Array Builder

real    0m8.392s
user    0m4.769s
sys 0m0.330s

我的代码:

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)
    }
}

time scala my_code.scala