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