在Kotlin中IntArray与数组<Int>
我不确定IntArray
和Array<Int>
之间的IntArray
在Kotlin中,为什么我不能互换使用它们:
我知道, IntArray
转换为int[]
针对JVM
,但是什么Array<Int>
转换为?
此外,你也可以有String[]
或YourObject[]
。 为什么Kotlin具有{primitive}Array
类型的类,而几乎任何东西都可以排列成一个数组,而不仅仅是基元。
Array<Int>
是引擎盖下的Integer[]
,而IntArray
是int[]
。 而已。
这意味着当你把一个Int
放入一个Array<Int>
,它总是被装箱的(具体地说,用一个Integer.valueOf()
调用)。 在IntArray
的情况下,不会发生装箱,因为它转换为Java原始数组。
除上述可能的性能影响之外,还有便利考虑。 原始数组可以保持未初始化,并且它们将在所有索引处具有默认的0
值。 这就是为什么IntArray
和原始数组的其余部分都有构造函数,只有一个大小参数:
val arr = IntArray(10) println(arr.joinToString()) // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
相比之下, Array<T>
没有一个只有size参数的构造函数:它需要所有索引上的有效非空T
实例在创建之后处于有效状态。 对于Number
类型,这可以是默认的0
,但是没有办法创建任意类型T
默认实例。
所以当创建一个Array<Int>
,你可以使用带有初始化函数的构造函数:
val arr = Array<Int>(10) { index -> 0 } // full, verbose syntax val arr = Array(10) { 0 } // concise version
或者创建一个Ąrray<Int?>
来避免初始化每个值,但是之后每次从数组中读取时,都会被迫处理可能的null
值。
val arr = arrayOfNulls<Int>(10)
Kotlin中的数组是类(而不是Java的“特殊”类型)。
Kotlin的stdlib为JVM原始数组提供了特殊用途类,以便改进Java语言集成和性能。
经验法则是使用Array<T>
除非在与现有的Java代码混合时引起问题,或者应该从Java类中调用。 为了记录,我从来没有使用IntArray
。
您可以在这里查看有关此问题的语言文档: https : //kotlinlang.org/docs/reference/basic-types.html#arrays