在Kotlin中IntArray与数组

我不确定IntArrayArray之间的IntArray在Kotlin中,为什么我不能互换使用它们:

missmatch

我知道, IntArray转换为int[]针对JVM ,但是什么Array转换为?

此外,你也可以有String[]YourObject[] 。 为什么Kotlin具有{primitive}Arraytypes的类,而几乎任何东西都可以排列成一个数组,而不仅仅是基元。

Array是引擎盖下的Integer[] ,而IntArrayint[] 。 而已。

这意味着当你把一个Int放入一个Array ,它总是被装箱的(具体地说,用一个Integer.valueOf()调用)。 在IntArray的情况下,不会发生装箱,因为它转换为Java原始数组。


除上述可能的性能影响之外,还有便利考虑。 原始数组可以保持未初始化,并且它们将在所有索引处具有默认的0值。 这就是为什么IntArray和原始数组的其余部分都有构造函数,只有一个大小参数:

 val arr = IntArray(10) println(arr.joinToString()) // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 

相比之下, Array没有一个只有size参数的构造函数:它需要所有索引的有效非空T实例在创建后处于有效状态。 对于Numbertypes,这可以是默认的0 ,但是没有办法创建任意typesT默认实例。

所以当创建一个Array ,你可以使用带初始化函数的构造函数:

 val arr = Array(10) { index -> 0 } // full, verbose syntax val arr = Array(10) { 0 } // concise version 

或者创建一个Ąrray来避免初始化每个值,但是之后每次从数组中读取时,都会被迫处理可能的null值。

 val arr = arrayOfNulls(10) 

Kotlin中的数组是类(而不是Java的“特殊”types)。

Kotlin的stdlib为JVM原始数组提供了特殊用途类,以便改进Java语言集成和性能。

经验法则是使用Array除非在与现有的Java代码混合时引起问题,或者应该从Java类中调用。 为了记录,我从来没有使用IntArray

您可以在这里查看有关此问题的语言文档: https : //kotlinlang.org/docs/reference/basic-types.html#arrays