Saya tidak yakin apa perbedaan antara an IntArray
dan an Array<Int>
di Kotlin dan mengapa saya tidak dapat menggunakannya secara bergantian:
Saya tahu itu IntArray
diterjemahkan menjadi int[]
ketika menargetkan JVM
, tapi apa yang Array<Int>
diterjemahkan ke?
Selain itu, Anda juga dapat memiliki String[]
atau YourObject[]
. Mengapa Kotlin memiliki kelas tipe {primitive}Array
ketika hampir semua hal dapat diatur ke dalam array, tidak hanya primitif.
Array<Int>
mengkompilasi keInteger[]
(jika kompiler tidak mengoptimalkan ini)Jawaban:
Array<Int>
adalah diInteger[]
bawah tenda, sedangkanIntArray
adalahint[]
. Itu dia.Ini berarti bahwa ketika Anda menempatkan
Int
dalamArray<Int>
, itu akan selalu kotak (khusus, denganInteger.valueOf()
panggilan). Dalam kasusIntArray
, tidak ada tinju yang akan terjadi, karena ini diterjemahkan ke array primitif Java.Selain kemungkinan implikasi kinerja di atas, ada juga kemudahan untuk dipertimbangkan. Array primitif dapat dibiarkan tidak diinisialisasi dan akan memiliki
0
nilai default di semua indeks. Inilah sebabnya mengapaIntArray
dan array primitif lainnya memiliki konstruktor yang hanya mengambil parameter ukuran:val arr = IntArray(10) println(arr.joinToString()) // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Sebaliknya,
Array<T>
tidak memiliki konstruktor yang hanya mengambil parameter ukuran: ia memerlukanT
instance non-null yang valid di semua indeks agar berada dalam keadaan valid setelah dibuat. UntukNumber
tipe, ini bisa menjadi default0
, tetapi tidak ada cara untuk membuat contoh default dari tipe arbitrerT
.Jadi saat membuat
Array<Int>
, Anda bisa menggunakan konstruktor yang juga menggunakan fungsi penginisialisasi:val arr = Array<Int>(10) { index -> 0 } // full, verbose syntax val arr = Array(10) { 0 } // concise version
Atau buat
Array<Int?>
untuk menghindari keharusan menginisialisasi setiap nilai, tetapi kemudian Anda akan dipaksa untuk menangani kemungkinannull
nilai setiap kali Anda membaca dari array.val arr = arrayOfNulls<Int>(10)
sumber
int[]
adalahIntArray
,Integer[]
apakahArray<Int>
, dan seterusnya, di mana kelas baru yang misterius ini? Itu hal yang sama hanya sintaks yang berbeda.int[]
juga berkelas.Perlu dicatat bahwa menggunakan
*
operator spread ( ) pada avararg
akan mengembalikan fileIntArray
. Jika Anda membutuhkanArray<Int>
, Anda dapat mengonversiIntArray
penggunaan.toTypedArray()
.sumber
Array di Kotlin adalah kelas (bukan tipe "khusus" seperti Java).
Stdlib Kotlin menyediakan kelas tujuan khusus untuk array primitif JVM untuk meningkatkan integrasi dan kinerja bahasa Java.
Aturan praktisnya adalah menggunakan
Array<T>
kecuali jika menyebabkan masalah saat mencampur dengan kode Java yang ada, atau harus dipanggil dari kelas Java. Sebagai catatan, saya tidak pernah menggunakanIntArray
.Anda dapat memeriksa dokumentasi Bahasa terkait masalah ini di sini: https://kotlinlang.org/docs/reference/basic-types.html#arrays
sumber
Int
,Float
, dll, mengingat bahwa Kotlin tidak memiliki tipe yang berbeda untukBoolean
atauboolean
. Dalam hal array, saya akan berasumsi bahwa ituArray<Int>
akan berbeda dariIntArray
. Saya pribadi selalu menggunakan yang terakhir karena tidak pernah mengganggu saya, tetapi mungkin Kotlin memiliki pengoptimalan tambahan yang tidak saya sadari. Jika Anda memprogram hanya di kotlin, saya tidak melihat kasus apa pun di mana Anda membutuhkannya di atas yang lain, tetapi array primitif mungkin masih memiliki manfaatnya.