Kotlin MutableList的初始容量

时间:2020-05-09 14:12:49

标签: kotlin arraylist

我正在创建一个值列表,在这种情况下,尽管每次一次添加一个值,但最终的数字是事先知道的。该函数会被多次调用,因此它运行得越快越好。

在Java中,我将使用ArrayList构造函数来指定初始容量,因为从理论上讲,这会使其稍快一些,因为它避免了调整大小。

在Kotlin中,通常使用mutableListOf(),但这不允许初始容量。从理论上讲,这应该会导致代码变慢。

在这种情况下,是推荐的/惯用的Kotlin解决方案:

  1. 继续使用ArrayList构造函数; ArrayList是一个完全有效的MutableList。
  2. 忽略该问题;初始容量实际上不会对速度产生明显的影响。
  3. 还有什么?

3 个答案:

答案 0 :(得分:2)

填充一个不可变的列表

<array>

用零填充五个元素的可变列表

.data()

答案 1 :(得分:1)

更新的答案

我实际上对容量和大小感到困惑。 Kotlin stdlib中当前没有使用默认容量MutableList的实现。

你可以自己做。

1

过时的答案

mutableListOf不允许使用默认容量的原因之一是因为kotlin中的默认值不为空。

但是在ORDER BY包中有已定义的实用程序功能。

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

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

您可以使用List函数或MutableList函数创建具有默认容量及其映射的列表。

kotlin.collections

但是,如果打算使用非空列表,则Kotlin中不应有空值,否则您必须使用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 } // 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 } 之类的运算符进行空值检查。

答案 2 :(得分:1)

您可以将这个 mutableList() 预定义函数包装在如下函数中

fun <E> emptyMutableList(size: Int = 0): MutableList<E?> {
    return MutableList(size) {
        null
    }
}

这将返回大小为 MutableListsize,但也会将 null 分配给其所有单元格。现在,如果您想访问任何索引值,您的程序将不会像使用已接受答案中的解决方案那样因 java.lang.IndexOutOfBoundsException 崩溃。这是我的意思:

fun <E> emptyMutableList(size: Int = 0): MutableList<E?> {
    return MutableList(size) {
        null
    }
}

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

fun main() {
    val mutableList1 = mutableListWithCapacity<Int>(20)
    val mutableList2 = emptyMutableList<Int>(20)
    
    mutableList1[10] // this will throw a java.lang.IndexOutOfBoundsException
    
    mutableList2[10] // this will not throw an exception but it will return null
}

当然,一切都取决于您希望程序的内存效率与无崩溃程度。

快乐编码!