Kotlin Начальная емкость MutableList - PullRequest
3 голосов
/ 09 мая 2020

Я создаю список значений в контексте, когда случается так, что, хотя значения добавляются по одному, конечное число известно заранее. Это функция, которая будет вызываться много раз, поэтому чем быстрее она будет работать, тем лучше.

В Java я бы использовал конструктор ArrayList, который указывает начальную емкость, потому что теоретически это немного быстрее, потому что это позволяет избежать изменения размера.

В Kotlin обычно используется mutableListOf (), но это не позволяет использовать начальную емкость; теоретически это должно привести к несколько более медленному коду.

Рекомендуемое / idiomati c Kotlin решение в этом случае:

  1. Go впереди и используйте конструктор ArrayList ; ArrayList - это вполне допустимый MutableList.
  2. Не обращайте внимания на проблему; начальная емкость на самом деле никогда не оказывает заметного влияния на скорость.
  3. Что-то еще?

1 Ответ

1 голос
/ 09 мая 2020

Обновленный ответ

На самом деле меня смущали емкость и размер. Не существует реализации использования MutableList по умолчанию в Kotlin stdlib.

Вы можете создать его самостоятельно.

fun <T> mutableListWithCapacity(capacity: Int): MutableList<T> =
    ArrayList(capacity)

// creates a MutableList of Int with capacity of 5.
val mutableList = mutableListWithCapacity<Int>(5)

Устаревший ответ

Одна из причин почему mutableListOf не позволяет использовать емкость по умолчанию, потому что значения по умолчанию в kotlin не равны нулю.

Однако есть служебная функция определена в kotlin.collections пакете .

public inline fun <T> MutableList(size: Int, init: (index: Int) -> T): MutableList<T> {
    val list = ArrayList<T>(size)
    repeat(size) { index -> list.add(init(index)) }
    return list
}

Вы можете создать список с помощью функции List или MutableList с емкостью по умолчанию и ее отображением.

// creates a list of ints with default capacity of 10 and having nulls.
// But I highly doubt you should initialize it with a null since Kotlin is a null-safe language.
val list = MutableList<Int?>(10) { null }

Но поскольку в Kotlin не должно быть нулей, если предполагается использование ненулевого списка, иначе вы должны выполнить нулевую проверку с помощью операторов типа ?. !!..

...