Struktur data .NET:
Lebih ke percakapan tentang mengapa ArrayList dan Daftar sebenarnya berbeda
Array
Seperti yang dinyatakan oleh satu pengguna, Array adalah koleksi "old school" (ya, array dianggap sebagai koleksi meskipun bukan bagian dari System.Collections
). Tapi, apa "old school" tentang array dibandingkan dengan koleksi lain, yaitu yang sudah Anda daftarkan dalam judul Anda (di sini, ArrayList dan Daftar (Dari T))? Mari kita mulai dengan dasar-dasarnya dengan melihat Array.
Untuk memulai, Array dalam Microsoft .NET adalah, "mekanisme yang memungkinkan Anda untuk memperlakukan beberapa item [terkait secara logis] sebagai satu koleksi," (lihat artikel yang ditautkan). Apa artinya? Array menyimpan anggota individu (elemen) secara berurutan, satu demi satu dalam memori dengan alamat awal. Dengan menggunakan array, kita dapat dengan mudah mengakses elemen yang disimpan secara berurutan yang dimulai dari alamat itu.
Di luar itu dan bertentangan dengan pemrograman 101 konsepsi umum, Array benar-benar bisa sangat kompleks:
Array dapat berupa dimensi tunggal, multidimensi, atau jadded (array bergerigi layak dibaca). Array sendiri tidak dinamis: sekali diinisialisasi, sebuah array n cadangan ukuran cukup ruang untuk terus n jumlah objek. Jumlah elemen dalam array tidak dapat tumbuh atau menyusut. Dim _array As Int32() = New Int32(100)
cadangan cukup ruang pada blok memori untuk array mengandung 100 objek tipe primitif Int32 (dalam hal ini, array diinisialisasi untuk mengandung 0s). Alamat blok ini dikembalikan ke _array
.
Menurut artikel tersebut, Spesifikasi Bahasa Umum (CLS) mensyaratkan bahwa semua array berbasiskan nol. Array dalam .NET mendukung array berbasis tidak nol; Namun, ini jarang terjadi. Sebagai hasil dari "common-ness" dari array berbasis nol, Microsoft telah menghabiskan banyak waktu untuk mengoptimalkan kinerja mereka ; Oleh karena itu, array berdimensi tunggal, berbasis nol (SZ) adalah "spesial" - dan benar-benar implementasi terbaik dari array (bukan multidimensi, dll.) - karena SZ memiliki instruksi bahasa perantara khusus untuk memanipulasi mereka.
Array selalu dilewati oleh referensi (sebagai alamat memori) - bagian penting dari teka-teki Array untuk diketahui. Sementara mereka melakukan pemeriksaan batas (akan menimbulkan kesalahan), pemeriksaan batas juga dapat dinonaktifkan pada array.
Sekali lagi, halangan terbesar bagi array adalah bahwa mereka tidak berukuran besar. Mereka memiliki kapasitas "tetap". Memperkenalkan ArrayList dan Daftar (T) ke riwayat kami:
ArrayList - daftar non-generik
The ArrayList (bersama dengan List(Of T)
- meskipun ada beberapa perbedaan penting, di sini, dijelaskan nanti) - mungkin yang terbaik dianggap sebagai penambahan samping koleksi (dalam arti luas). ArrayList mewarisi dari antarmuka IList (turunan dari 'ICollection'). ArrayLists, sendiri, lebih besar - membutuhkan lebih banyak overhead - daripada Daftar.
IList
tidak memungkinkan implementasi untuk memperlakukan ArrayLists sebagai daftar berukuran tetap (seperti Array); Namun, di luar fungsi tambahan yang ditambahkan oleh ArrayLists, tidak ada keuntungan nyata untuk menggunakan ArrayLists yang ukurannya tetap karena ArrayLists (lebih dari Array) dalam hal ini sangat lambat.
Dari bacaan saya, ArrayLists tidak dapat digerigi: "Menggunakan array multidimensi sebagai elemen ... tidak didukung". Sekali lagi, paku lain di peti mati ArrayLists. ArrayLists juga tidak "diketik" - yang berarti bahwa, di bawah semuanya, ArrayList hanyalah sebuah Array dinamis Objects: Object[]
. Ini membutuhkan banyak tinju (implisit) dan unboxing (eksplisit) ketika mengimplementasikan ArrayLists, sekali lagi menambah overhead mereka.
Pemikiran yang tidak berdasar: Saya pikir saya ingat pernah membaca atau pernah mendengar dari salah satu profesor saya bahwa ArrayLists adalah semacam anak konseptual bajingan dari upaya untuk berpindah dari Array ke Koleksi Jenis-daftar, yaitu ketika pernah mengalami peningkatan besar ke Array, mereka bukan lagi pilihan terbaik karena pengembangan lebih lanjut telah dilakukan sehubungan dengan koleksi
List (Of T): Apa yang menjadi ArrayList (dan berharap menjadi)
Perbedaan dalam penggunaan memori cukup signifikan di mana Daftar (Dari Int32) mengkonsumsi 56% lebih sedikit memori daripada ArrayList yang mengandung tipe primitif yang sama (8 MB vs 19 MB dalam demonstrasi terkait pria di atas: sekali lagi, ditautkan di sini ) - meskipun ini adalah hasil yang diperparah oleh mesin 64-bit. Perbedaan ini benar-benar menunjukkan dua hal: pertama (1), sebuah kotak "objek" tipe Int32 (ArrayList) jauh lebih besar daripada tipe primitif Int32 murni (Daftar); kedua (2), perbedaannya eksponensial sebagai hasil dari pengerjaan mesin 64-bit.
Jadi, apa bedanya dan apa itu List (Of T) ? MSDN mendefinisikan List(Of T)
sebagai, "... daftar objek yang diketik dengan sangat kuat yang dapat diakses oleh indeks." Pentingnya di sini adalah bit "sangat diketik": daftar (Dari T) 'mengenali' jenis dan menyimpan objek sebagai tipenya. Jadi, sebuah Int32
disimpan sebagai Int32
dan bukan Object
tipe. Ini menghilangkan masalah yang disebabkan oleh tinju dan unboxing.
MSDN menentukan perbedaan ini hanya berlaku ketika menyimpan tipe primitif dan bukan tipe referensi. Juga, perbedaannya benar-benar terjadi dalam skala besar: lebih dari 500 elemen. Yang lebih menarik adalah bahwa dokumentasi MSDN berbunyi, "Adalah keuntungan bagi Anda untuk menggunakan implementasi tipe-spesifik dari kelas List (Of T) daripada menggunakan kelas ArrayList ...."
Pada dasarnya, List (Of T) adalah ArrayList, tetapi lebih baik. Ini adalah "setara generik" dari ArrayList. Seperti ArrayList, itu tidak dijamin untuk diurutkan sampai disortir (gambar). Daftar (Of T) juga memiliki beberapa fungsi tambahan.