scala.collections.mutable.ArrayBuilder 和 scala.collections.mutable.ArrayBuffer 有什么区别?例如,如果我需要构建一个 Array[Int],最好使用哪个?是否有任何性能差异,例如 java.lang.StringBuffer 和 java.lang.StringBuilder?
10964 次
2 回答
44
ArrayBuilder是 a Builder,并且构建器旨在通过向它们添加元素来构建其他集合。构建器通常不打算直接在客户端代码中使用。
ArrayBufferis a Bufferand Seq-- 缓冲区是您可以有效地附加元素的序列。序列带有很多辅助操作。
你可能需要一个ArrayBuffer. 它旨在用作ArrayListJava中的替代品。该类ArrayBuffer是一个功能齐全的序列集合,包含所有批量数据操作,如foreach、map、filter、zip和朋友,不像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 回答