Я не уверен, в чем разница между an IntArray
и an Array<Int>
в Kotlin и почему я не могу использовать их взаимозаменяемо:
Я знаю , что IntArray
переводится int[]
в информировании JVM
, но что Array<Int>
переводить?
Кроме того, вы также можете иметь String[]
или YourObject[]
. Почему в Kotlin есть классы такого типа, {primitive}Array
когда в массив можно упорядочить практически все, а не только примитивы.
Array<Int>
компилируется вInteger[]
(если компилятор не оптимизирует это)Ответы:
Array<Int>
находитсяInteger[]
под капотом, аIntArray
этоint[]
. Вот и все.Это означает, что когда вы помещаете
Int
в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)
источник
int[]
естьIntArray
,Integer[]
естьArray<Int>
и так далее, где этот таинственный новый класс? То же самое, только синтаксис другой.int[]
тоже класс, кстати.Стоит отметить, что использование
*
оператора spread ( ) дляvararg
объекта вернетIntArray
. Если вам нуженArray<Int>
, вы можете преобразовать свойIntArray
using.toTypedArray()
.источник
Массивы в Kotlin - это классы (а не «особые» типы, такие как Java).
Stdlib Kotlin предоставляет классы специального назначения для массивов примитивов 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, я не вижу случаев, когда вам нужен один над другим, но примитивный массив может иметь свои преимущества.