Kotlin数组<init> ialization

时间:2019-06-30 01:36:46

标签: arrays kotlin built-in array-initialization

我将从字节流中读取数据。 Kotlin是否将数组生成函数的索引赋予(如https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-array/-init-.html中所述),以保证从 被依次调用,从零开始?

Array.kt文件位于builtins下,所以我在哪里找不到实际代码。

2 个答案:

答案 0 :(得分:4)

看看at the source code for Array

public inline constructor(size: Int, init: (Int) -> T)

init参数是一个带有int(特定项目的索引)的函数,该函数期望数组组成的T类型的返回值。

如示例中其他答案所示,这些被依次调用,因为这是“自然”的方式。如果您听不懂我的意思,请考虑实施替代方案:

for (i in 0..size) {
    this.addToArray(init(i));
}

或者:

for (i in (size - 1)..0 {
    this.addToArray(init(i));
}

相比:

val indices = mutableListOf<Int>()
while (indices.size != size) {
    val i = random.nextInt(size); 
    if (i !in indices) {
        indices.add(i);
        this.addToArray(init(i));
    }
}

虽然我们看不到构造函数的源代码,但是仅在其他答案中显示的示例表明它们不能使用随机方法。从数学上讲,应用the first answer中的代码,使用随机并按顺序打印出0-49的几率非常低。

此外,这是backed up by an answer here。生成的已编译Java代码创建了一个从0到size的for循环。对于JVM,假设他们不更改实现,则可以假设它会从0变为size。但是无论是从0到size还是从size到0,如果您不喜欢该顺序,都可以随时将其反转。

如果您需要100%确保其大小从0变为零,或者如果实现发生变化,则可以执行以下操作:

var a = (0 until 10).step(1).toList().toTypedArray()

在这种情况下,将产生一个数字为0-9的数组。

如果需要对象或以其他方式更改对象,则可以在创建列表之前添加.map {}。话虽如此,只要init函数可以按您期望的那样工作,这是一种替代方法。

您总是可以通过使用IntelliJ,Android Studio,某些其他IDE或您选择的反编译器对代码进行反编译来进行确认。但是无论采用哪种实现方式,它们总是会按顺序排列-因此您不必担心。他们唯一可能更改的是init函数的调用顺序,但是在生成的数组中,它最终的顺序仍然相同。

答案 1 :(得分:0)

That does seem to be the case. 代码:

fun main() {
    val x = Array(50) {println(it)}
}