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[](якщо компілятор не оптимізує це)