размер ArrayBuffer - PullRequest
       2

размер ArrayBuffer

2 голосов
/ 20 июня 2011

Предположим, я создал ArrayBuffer с начальным размером, равным 10

val buf = new ArrayBuffer[Int](10)

Если я вызвал метод buf.size - получил размер буфера, равный 0?

Ответы [ 4 ]

9 голосов
/ 20 июня 2011

Предполагается, что класс буфера массива является расширяемым массивом, в который можно эффективно добавлять элементы в конце, используя +=.Первоначально при создании число элементов равно 0, что называется size коллекции.

Внутренне буфер массива поддерживает массив элементов, который содержит только null s, когдабуфер создан.Как только элемент добавлен, запись происходит в массив.Когда массив заполняется, выделяется новый массив двойной длины и в него копируются элементы. амортизированное время добавления элемента остается O (1).

Аргумент ctor просто говорит, какой будет начальная длина внутреннего массива.Хотя изменение начальной длины не меняет амортизированную стоимость +=, она может избежать ненужных перераспределений, если вы знаете, сколько элементов вы добавите к ней, и, таким образом, она будет более эффективной (по сути, уменьшая константу в амортизированном анализе).

Этот аргумент называется не размером, а емкостью буфера массива.

4 голосов
/ 20 июня 2011

Да, поскольку size (в данном случае унаследовано от IndexedSeq) относится к числу элементов в коллекции, а не к размеру или длине базовой структуры данных.

2 голосов
/ 20 июня 2011

Использование 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.

1 голос
/ 30 апреля 2014

Чтобы инициализировать буфер массива с заданным размером и значением:

ArrayBuffer.fill(10)(5)

, который получит:

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