我不确定在Kotlin中anIntArray
和an之间的区别是什么Array<Int>
,为什么我不能互换使用它们:
我知道IntArray
将int[]
定位到时JVM
会Array<Int>
转化为,但是转化为什么?
另外,您也可以拥有String[]
或YourObject[]
。为什么Kotlin拥有类型的类,而{primitive}Array
几乎所有东西都可以排列成数组,而不仅仅是原语。
Answers:
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
相反,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
或创建一个Array<Int?>
以避免必须初始化每个值,但是稍后您null
每次从数组中读取数据时都会被迫处理可能的值。
val arr = arrayOfNulls<Int>(10)
int[]
是IntArray
,Integer[]
是Array<Int>
,依此类推,这个神秘的新班级在哪里?只是语法不同,这是同一件事。int[]
顺便说一句,它也是上课的。
值得注意的是,在上使用spread(*
)运算符vararg
将返回IntArray
。如果您需要Array<Int>
,您可以将转换IntArray
使用.toTypedArray()
。
Kotlin中的数组是类(不是Java的“特殊”类型)。
Kotlin的stdlib为JVM基本数组提供了特殊用途的类,以改善Java语言的集成和性能。
经验法则是使用,Array<T>
除非它在与现有Java代码混合时会引起问题,或者应该从Java类中调用。出于记录,我从未使用过IntArray
。
您可以在此处查看有关此问题的语言文档:https : //kotlinlang.org/docs/reference/basic-types.html#arrays
Int
,Float
因为科特林不会有不同的类型,等等,Boolean
或boolean
。就数组而言,我认为这Array<Int>
与有所不同IntArray
。我个人一直使用后者,因为它从来没有打扰过我,但是Kotlin可能还有我不知道的其他优化。如果您仅使用Kotlin进行编程,那么在任何情况下您都不需要一个,但是原始数组可能仍然有其优点。
Array<Int>
编译到Integer[]
(如果编译器没有对此进行优化)