Array<Int>
є Integer[]
під капотом, тоді як IntArray
є int[]
. Це воно.
Це означає, що коли ви ставите Int
ін Array<Int>
, він завжди буде в коробці (зокрема, із Integer.valueOf()
дзвінком). У випадку IntArray
, бокс не відбудеться, оскільки він перетворюється на примітивний масив Java.
Окрім можливих наслідків для продуктивності вищезазначеного, є також зручність для розгляду. Примітивні масиви можна не ініціалізувати, і вони матимуть 0
значення за замовчуванням для всіх індексів. Ось чому, IntArray
а решта примітивних масивів мають конструктори, які приймають лише параметр size:
val arr = IntArray(10)
println(arr.joinToString())
На відміну від цього, Array<T>
не має конструктора, який приймає лише параметр розміру: йому потрібні дійсні, не нульові T
екземпляри всіх індексів, щоб бути в дійсному стані після створення. Для Number
типів це може бути за замовчуванням 0
, але немає можливості створити екземпляри за замовчуванням довільного типу T
.
Отже, при створенні Array<Int>
, ви можете або використовувати конструктор, який також виконує функцію ініціалізації:
val arr = Array<Int>(10) { index -> 0 }
val arr = Array(10) { 0 }
Або створіть, Array<Int?>
щоб уникнути необхідності ініціалізувати кожне значення, але потім ви будете змушені мати справу з можливими null
значеннями кожного разу, коли читаєте з масиву.
val arr = arrayOfNulls<Int>(10)
Array<Int>
компілюється доInteger[]
(якщо компілятор не оптимізує це)