我正在创建一个值列表,在这种情况下,尽管每次一次添加一个值,但最终的数字是事先知道的。该函数会被多次调用,因此它运行得越快越好。
在Java中,我将使用ArrayList构造函数来指定初始容量,因为从理论上讲,这会使其稍快一些,因为它避免了调整大小。
在Kotlin中,通常使用mutableListOf(),但这不允许初始容量。从理论上讲,这应该会导致代码变慢。
在这种情况下,是推荐的/惯用的Kotlin解决方案:
答案 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
}
}
这将返回大小为 MutableList
的 size
,但也会将 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
}
当然,一切都取决于您希望程序的内存效率与无崩溃程度。
快乐编码!