Kotlin 阵列与阵列<;Int>;在科特林

Kotlin 阵列与阵列<;Int>;在科特林,kotlin,Kotlin,我不确定IntArray和Array在Kotlin中有什么区别,为什么不能互换使用它们: 我知道当针对JVM时,IntArray转换成int[],但是Array转换成什么呢 此外,还可以使用字符串[]或对象[]。为什么Kotlin有{primitive}Array类型的类,而几乎任何东西都可以排列成数组,而不仅仅是原语。Kotlin中的数组是类(而不是像Java这样的“特殊”类型) Kotlin的stdlib为JVM基元数组提供了特殊用途的类,以改进Java语言集成和性能 经验法则是使用数组,

我不确定
IntArray
Array
在Kotlin中有什么区别,为什么不能互换使用它们:

我知道当针对
JVM
时,
IntArray
转换成
int[]
,但是
Array
转换成什么呢


此外,还可以使用
字符串[]
对象[]
。为什么Kotlin有
{primitive}Array类型的类
,而几乎任何东西都可以排列成数组,而不仅仅是原语。

Kotlin中的数组是类(而不是像Java这样的“特殊”类型)

Kotlin的stdlib为JVM基元数组提供了特殊用途的类,以改进Java语言集成和性能

经验法则是使用
数组
,除非它在与现有Java代码混合时引起问题,或者应该从Java类中调用。作为记录,我从未在阵列中使用过
IntArray

您可以在此处查看该语言有关此问题的文档:

Array
在引擎盖下是一个
Integer[]
,而
IntArray
是一个
int[]
。就这样

这意味着,当您将
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
没有只接受大小参数的构造函数:它需要所有索引中的有效、非null的
t
实例在创建后处于有效状态。对于
Number
类型,这可能是默认的
0
,但无法创建任意类型的默认实例
T

因此,在创建
数组时,您可以使用也具有初始值设定项函数的构造函数:

val arr = Array<Int>(10) { index -> 0 }  // full, verbose syntax
val arr = Array(10) { 0 }                // concise version

值得注意的是,在
vararg
上使用spread(
*
)运算符将返回
IntArray
。如果您需要一个
数组
,您可以使用
.toTypedArray()

数组
转换为
整数[]
(如果编译器未对此进行优化),请参见,这很有意义,谢谢!我相信你总是喜欢数组而不是IntArray,我担心使用boxed类型vs primitive的装箱/拆箱开销,但Kotlin似乎足够聪明,可以决定是否可以使用primitive。(如果我错了,请纠正我)“在Java平台上,数字被物理存储为JVM基元类型,除非我们需要一个可为空的数字引用(例如Int?)或涉及泛型。在后一种情况下,数字被装箱。”From@feresr绝对不是专家,但我认为这只是指
Int
的实现,
Float
等,考虑到Kotlin对于
Boolean
Boolean
没有不同的类型。就数组而言,我假设
Array
IntArray
不同。我个人一直使用后者,因为它从来没有困扰过我,但也许Kotlin有额外的优化,我不知道。如果您只使用kotlin进行编程,我看不出任何情况下您需要一个而不是另一个,但是基元数组可能仍然有它的优点。@AllanW也不是专家,只是好奇,我相信java同时具有基元和装箱对象,因为它使用基元更有效,对吗?,当然,有时确实需要使用对象(nullability/泛型)。这超出了我最初问题的范围,但我想知道Kotlin在针对JVM时是如何处理这一问题的。我尽可能地使用IntArray(认为它在幕后使用原语),但在@jampcomment之后,我不再确定了。@feresr对我来说,Kotlin的文档明确声明特殊数组实例的存在是为了避免装箱开销。我的观点是,这两个答案可能不同,最终对开发人员来说,这与决定在Java中使用Integer[]还是int[]是一样的。我同意,那么公认的答案对新手来说可能有点误导,我正因为这个原因取消将其标记为公认的答案。这是一个相当愚蠢的决定。因此,他们必须为每个基本类型创建一个新类。。。他们可以使用与Java上相同的工具。@androiddeveloper什么新类
int[]
IntArray
Integer[]
Array
,等等,这个神秘的新类在哪里?这是一样的,只是语法不同<代码>int[]
也是类,顺便说一下。@EugenPechanec这很有趣。他们说这是一个类,它有一个实例,但也“这个类的实例表示为int[]”。那么,这些函数仅仅是扩展函数,还是真正的类?为什么需要有“IntArray”和其他?仍然可以使用Java语法完成。@EugenPechanec但在Java中,int[]不是类,不是吗?它是一个对象,一组基本体。您无法访问is代码,也无法从其扩展。不Java上的所有类的名称都有大写字母。这里不是。@EugenPechanec所以在Kotlin上它是一个类,而在Java上它不是。但还是不明白为什么。他们可以只添加扩展功能,不是吗?你可以从英塔里延伸吗?关于命名,我知道。这只是一个惯例,也是一个很好的惯例。
val arr = arrayOfNulls<Int>(10)