Kotlin中的IntArray与Array

IntArray vs Array in Kotlin

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

missmatch

我知道以JVM为目标时IntArray会转换为int[],但是Array会转换为什么?

另外,您还可以具有String[]YourObject[]。 为什么Kotlin拥有类型为{primitive}Array的类,而几乎所有东西都可以排列成数组,而不仅仅是原语。


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

这意味着,当将Int放入Array时,它将始终被装箱(特别是使用Integer.valueOf()调用)。在IntArray的情况下,将不会发生装箱,因为它会转换为Java基本数组。

除了上述可能对性能的影响外,还需要考虑一些便利。原始数组可以保留为未初始化,并且它们在所有索引处均具有默认的0值。这就是IntArray和其他原始数组具有仅采用size参数的构造函数的原因:

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

相比之下,Array< T >没有仅采用size参数的构造函数:创建后,它在所有索引上都需要有效的非null T实例,以使其处于有效状态。对于Number类型,这可能是默认的0,但是无法创建任意类型T的默认实例。

因此,在创建Array时,您也可以使用带有初始化函数的构造函数:

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

或创建一个Array以避免必须初始化每个值,但是随后您每次从数组中读取数据时都会被迫处理可能的null值。

1
val arr = arrayOfNulls<Int>(10)


值得注意的是,在vararg上使用传播(*)运算符将返回IntArray。如果需要Array,则可以使用.toTypedArray()转换IntArray


Kotlin中的数组是类(不是Java的"特殊"类型)。

Kotlin的stdlib为JVM基本数组提供了特殊用途的类,以改善Java语言的集成和性能。

经验法则是使用Array< T >,除非它在与现有Java代码混合时会引起问题,或者应从Java类中调用。出于记录,我从来不必使用IntArray

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