Array<Int>
is an Integer[]
在引擎盖下,同时IntArray
is an int[]
。就是这样。
这意味着当您放置Int
in an 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>
没有只接受大小参数的构造函数:它需要有效的、非空的T
所有索引上的实例在创建后都处于有效状态。为了Number
类型,这可能是默认值0
,但无法创建任意类型的默认实例T
.
所以当创建一个Array<Int>
,您也可以使用带有初始化函数的构造函数:
val arr = Array<Int>(10) { index -> 0 } // full, verbose syntax
val arr = Array(10) { 0 } // concise version
或者创建一个Array<Int?>
以避免必须初始化每个值,但随后您将被迫处理可能的情况null
每次从数组读取时的值。
val arr = arrayOfNulls<Int>(10)