32

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

4

2 回答 2

44

ArrayBuilder是 a Builder,并且构建器旨在通过向它们添加元素来构建其他集合。构建器通常不打算直接在客户端代码中使用。

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

你可能需要一个ArrayBuffer. 它旨在用作ArrayListJava中的替代品。该类ArrayBuffer是一个功能齐全的序列集合,包含所有批量数据操作,如foreachmapfilterzip和朋友,不像ArrayBuilder它只配备+=了添加元素并result在最后获取数组。

您可能更喜欢 an 的一个地方ArrayBuilder是当您为原始类型实例化它Int并且您关心性能时。在这种情况下,ArrayBuilder变体专门用于不同的原始类型并保存适当原始类型的底层数组,而 anArrayBuffer始终在下面保存一个对象数组——您添加到其中的每个原始类型都会进行装箱。

实例化数组缓冲区:

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

要实例化数组构建器:

new ArrayBuilder.ofInt // gives you a manually specialized array builder that will hold real primitives
于 2013-04-05T17:20:58.860 回答
11

我对它进行了计时,并且构建一个数组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
于 2016-12-26T15:05:29.637 回答