scala.collections.mutable.ArrayBuilder和scala.collections.mutable.ArrayBuffer有什么区别?例如,如果我需要构建一个可以使用的Array [Int],那么?是否存在任何性能差异,例如java.lang.StringBuffer和java.lang.StringBuilder?
答案 0 :(得分:42)
ArrayBuilder
是Builder
,构建器用于通过向其添加元素来构建其他集合。通常不打算在客户端代码中直接使用构建器。
ArrayBuffer
是Buffer
和Seq
- 缓冲区是您可以有效附加元素的序列。序列带有很多辅助操作。
您可能需要ArrayBuffer
。它旨在用作Java中ArrayList
的替代。 ArrayBuffer
类是一个完全强大的序列集合,包含foreach
,map
,filter
,zip
和朋友等所有批量数据操作,与{{{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