我不确定在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[](如果编译器没有对此进行优化)