Jawaban:
Scala List
adalah struktur data rekursif berubah yang adalah suatu struktur fundamental dalam Scala, bahwa Anda harus (mungkin) akan menggunakannya lebih dari satu Array
(yang sebenarnya bisa berubah - yang analog berubah dari Array
yang IndexedSeq
).
Jika Anda berasal dari latar belakang Jawa, maka paralel yang jelas adalah ketika menggunakan LinkedList
lebih ArrayList
. Yang pertama umumnya digunakan untuk daftar yang hanya pernah dilintasi (dan yang ukurannya tidak diketahui dimuka) sedangkan yang kedua harus digunakan untuk daftar yang memiliki ukuran yang diketahui (atau ukuran maksimum) atau yang penting untuk akses acak cepat .
ListBuffer
memberikan konversi waktu-konstan ke List
yang hanya digunakan untuk alasan ListBuffer
jika diperlukan konversi nanti.
Scala Array
harus diimplementasikan pada JVM oleh array Java, dan karenanya Array[Int]
mungkin lebih performan (sebagai int[]
) dari List[Int]
(yang akan mengotak isinya, kecuali Anda menggunakan versi Scala terbaru yang memiliki @specialized
fitur baru ) .
Namun, saya berpikir bahwa penggunaan Array
s di Scala harus dijaga agar tetap minimum karena rasanya Anda benar-benar perlu tahu apa yang terjadi di bawah tenda untuk memutuskan apakah array Anda benar-benar akan didukung oleh tipe primitif yang diperlukan, atau mungkin kotak sebagai jenis pembungkus.
Selain jawaban yang sudah diposting, berikut adalah beberapa spesifik.
Sementara Array[A]
secara harfiah array Java, sebuah List[A]
adalah struktur data berubah yang baik Nil
(daftar kosong) atau terdiri dari sepasang (A, List[A])
.
Perbedaan kinerja
Array List
Access the ith element θ(1) θ(i)
Delete the ith element θ(n) θ(i)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Count the elements θ(1) θ(n)
Perbedaan memori
Array List
Get the first i elements θ(i) θ(i)
Drop the first i elements θ(n-i) θ(1)
Insert an element at i θ(n) θ(i)
Reverse θ(n) θ(n)
Concatenate (length m,n) θ(n+m) θ(n)
Jadi, kecuali Anda memerlukan akses acak cepat, perlu menghitung elemen, atau karena alasan tertentu Anda memerlukan pembaruan yang merusak, a List
lebih baik daripada a Array
.
list = list.drop(i)
. Atau, Apakah ada keajaiban di balik tudung?
drop
tidak perlu menyalin bagian dari daftar yang tidak dibatalkan. Misalnya (x::xs).drop(1)
persis xs
, bukan "salinan" dari xs
.
Array bisa berubah, artinya Anda dapat mengubah nilai setiap indeks, sedangkan Daftar (secara default) tidak berubah, artinya daftar baru dibuat setiap kali Anda melakukan modifikasi. Dalam kebanyakan kasus itu adalah lebih "fungsional" gaya bekerja dengan tipe data berubah dan Anda mungkin harus mencoba dan menggunakan Daftar dengan konstruksi seperti yield
, foreach
, match
dan sebagainya.
Untuk karakteristik kinerja, sebuah Array lebih cepat dengan akses acak ke elemen, sedangkan Daftar lebih cepat ketika menambahkan (menambahkan) elemen baru. Iterasi atas mereka sebanding.
iterate over
, karena cache