1. ホーム
  2. kotlin

[解決済み] KotlinのIntArrayとArray<Int>の比較

2022-10-23 09:19:13

疑問点

の違いがよくわかりません。 IntArrayArray<Int> がKotlinではどうなるのか、そしてなぜそれらを使い分けられないのか。

私が知っているのは IntArray は、次のように変換されます。 int[] をターゲットにした場合 JVM をターゲットにしたとき、しかし Array<Int> は何に変換されるのでしょうか?

また String[] または YourObject[] . なぜ Kotlin は {primitive}Array というクラスがあるのはなぜでしょうか?

どのように解決するのですか?

Array<Int>Integer[] の下にあり、一方 IntArrayint[] . これだけです。

これはつまり 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 パラメータを受け取るだけのコンストラクタを持ちません:有効で非 null の 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)