ArrayBuffer的大小

时间:2011-06-20 04:53:15

标签: scala scala-collections

假设我创建初始大小等于10的ArrayBuffer

val buf = new ArrayBuffer[Int](10)

如果我调用方法buf.size - 得到缓冲区的大小等于0?

4 个答案:

答案 0 :(得分:8)

数组缓冲区类是一个可扩展的数组,您可以使用+=在其中有效地添加元素。最初,在创建时,元素的数量为0 - 被称为集合的size

在内部,数组缓冲区维护一个元素数组,在创建缓冲区时仅包含null个元素。添加元素后,会在数组中进行写入。当数组变满时,将分配一个具有双倍长度的新数组,并将元素复制到其中。添加元素的amortized时间仍为O(1)。

ctor参数只是说明内部数组的初始长度是多少。虽然更改初始长度不会改变+=的摊销成本,但如果您知道要添加多少元素,则可以避免不必要的重新分配,从而提高效率(实质上,减少摊销分析中的常量)

这个参数不是大小,而是数组缓冲区的容量。

答案 1 :(得分:4)

是的,因为size(在这种情况下继承自IndexedSeq)是指集合中元素的数量,而不是基础数据结构的大小或长度。

答案 2 :(得分:2)

使用http://www.simplyscala.com/

import scala.collection.mutable.ArrayBuffer
val buf = new ArrayBuffer[Int](10)
buf: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

buf.size
res0: Int = 0

buf.length
res1: Int = 0

所以我猜,答案不是10。

答案 3 :(得分:1)

初始化具有给定大小和值的arraybuffer:

ArrayBuffer.fill(10)(5)

将获得:

scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(5, 5, 5, 5, 5, 5, 5, 5, 5, 5)