在Kotlin中IntArray与Array <Int>

FRR*_*FRR 54 kotlin

我不确定an IntArray和an 之间的区别在于Array<Int>Kotlin以及为什么我不能互换使用它们:

missmatch

我知道IntArray转换为int[]定位时JVM,但Array<Int>转换为什么?

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

zsm*_*b13 65

Array<Int>是一个Integer[]引擎盖,IntArray而是一个int[].而已.

这意味着当你Int输入一个时Array<Int>,它将始终被装箱(具体而言,通过Integer.valueOf()呼叫).在这种情况下IntArray,不会发生装箱,因为它转换为Java原始数组.


除了上述可能的性能影响之外,还有考虑的便利性.原始数组可以保持未初始化状态,并且它们将0在所有索引处具有默认值.这就是原因IntArray,其他原始数组的构造函数只接受一个size参数:

val arr = IntArray(10)
println(arr.joinToString()) // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Run Code Online (Sandbox Code Playgroud)

相反,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
Run Code Online (Sandbox Code Playgroud)

或者创建一个Array<Int?>以避免必须初始化每个值,但是null每次从数组中读取时,您将被迫处理可能的值.

val arr = arrayOfNulls<Int>(10)
Run Code Online (Sandbox Code Playgroud)

  • @androiddeveloper 什么新课程?`int[]` 是 `IntArray`,`Integer[]` 是 `Array&lt;Int&gt;` 等等,这个神秘的新类在哪里?这是同一件事,只是语法不同。顺便说一句,“int[]”也是类。 (4认同)
  • 这是很愚蠢的决定。因此,他们必须为每种原始类型创建一个新类……他们可以使用与Java相同的类。 (3认同)
  • @EugenPechanec 这很有趣。他们说它是一个类并且它有一个实例,但也“此类的实例表示为 int[]”:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int-array/索引.html。那么,这些函数只是扩展函数,还是属于真正的类?为什么需要“IntArray”和其他?仍然可以使用 Java 语法来完成。 (3认同)

Era*_*nah 9

值得注意的是,*在 a 上使用 spread( ) 运算符vararg将返回 an IntArray。如果您需要Array<Int>,您可以将您的IntArrayusing转换为.toTypedArray().