我不确定an IntArray和an 之间的区别在于Array<Int>Kotlin以及为什么我不能互换使用它们:
我知道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)
值得注意的是,*在 a 上使用 spread( ) 运算符vararg将返回 an IntArray。如果您需要Array<Int>,您可以将您的IntArrayusing转换为.toTypedArray().
| 归档时间: |
|
| 查看次数: |
12552 次 |
| 最近记录: |