Dalam pertanyaan ini Bagaimana saya bisa secara efisien memilih wadah Perpustakaan Standar dalam C ++ 11? adalah bagan alur yang berguna untuk digunakan saat memilih koleksi C ++.
Saya pikir ini adalah sumber yang berguna untuk orang-orang yang tidak yakin koleksi mana yang harus mereka gunakan jadi saya mencoba untuk menemukan bagan alur yang sama untuk Jawa dan tidak dapat melakukannya.
Sumber daya apa dan "lembar contekan" yang tersedia untuk membantu orang memilih Koleksi yang tepat untuk digunakan saat pemrograman di Jawa? Bagaimana orang tahu implementasi Daftar, Set, dan Peta apa yang harus mereka gunakan?
Jawaban:
Karena saya tidak dapat menemukan diagram alur yang sama, saya memutuskan untuk membuatnya sendiri.
Diagram alir ini tidak mencoba dan penutup hal-hal seperti akses disinkronkan, benang pengaman dll atau koleksi warisan, tetapi tidak menutupi 3 standar Set s, 3 standar Peta dan 2 standar Daftar s.
Gambar ini dibuat untuk jawaban ini dan dilisensikan di bawah Lisensi Internasional Creative Commons Attribution 4.0. Atribusi paling sederhana adalah dengan menautkan ke pertanyaan ini atau jawaban ini.
Sumber daya lainnya
Mungkin referensi lain yang paling berguna adalah halaman berikut dari dokumentasi oracle yang menjelaskan setiap Koleksi .
HashSet vs TreeSet
Ada diskusi terperinci tentang kapan harus menggunakan
HashSet
atau diTreeSet
sini: Hashset vs TreesetArrayList vs LinkedList
Diskusi terperinci: Kapan menggunakan LinkedList daripada ArrayList?
sumber
LinkedList
vs AndaArrayList
. Pertama, jika daftar memiliki ukuran yang signifikan,LinkedList
lebih disukai.LinkedList
memiliki overhead per-elemen, sehingga asymptotically lebih buruk dalam hal konsumsi memori daripadaArrayList
. Juga, jika sebagian besar akses berada di akhir daftar,ArrayList
lebih disukai karena memberikan akses elemen acak waktu konstan. Mengaksesn
elemen th dariLinkedList
adalahO(n)
operasi. ... Faktanya, keputusan untuk menggunakan daftar tertaut harus selalu "tidak".LinkedList
adalah daftar yang ditautkan ganda, jadi akses di awal dan di akhir keduanya cepat. Anda akan mencatat bahwa dari cabang-cabang di atas ketiga pertanyaan harus dijawab ya sebelum saya merekomendasikan menggunakanLinkedList
- jadi dengan kata lain saya setuju dengan Anda bahwa dalam kebanyakan kasus jawabannya adalah tidak. Hal-hal seperti antrian dan dequeues di mana Anda terus menambahkan dan menghapus hal-hal dari ujung area daftar kasus penggunaan yang baikLinkedList
.LinkedList
menggunakan lebih banyak memori per elemen ...ArrayList
tidak pernah melepaskan memori. Itu berarti bahwa jika Anda memiliki daftar yang terkadang tumbuh dengan ukuran besar tetapi biasanya kecil makaArrayList
akan memberikan kinerja memori yang lebih buruk. Memori overheadList
itu sendiri biasanya (walaupun tidak selalu) kecil dibandingkan dengan elemen yang dikandungnya juga.Map<K,V>
bukan bagian darijava.util.collection
Ringkasan koleksi utama yang tidak bersamaan, tidak disinkronkan
Collection
: Antarmuka yang mewakili "tas" tanpa urutan item, disebut "elemen". Elemen "selanjutnya" tidak terdefinisi (acak).Set
: Antarmuka yang mewakiliCollection
tanpa duplikat.HashSet
: ASet
didukung oleh aHashtable
. Penggunaan memori tercepat dan terkecil, ketika memesan tidak penting.LinkedHashSet
: AHashSet
dengan tambahan daftar yang ditautkan untuk mengaitkan elemen dalam urutan penyisipan . Elemen "berikutnya" adalah elemen berikutnya yang paling baru disisipkan.TreeSet
: A diSet
mana elemen dipesan olehComparator
(biasanya pemesanan alami ). Penggunaan memori paling lambat dan terbesar, tetapi perlu untuk pemesanan berbasis komparator.EnumSet
:Set
Kustomisasi yang sangat cepat dan efisien untuk tipe enum tunggal.List
: Sebuah antarmuka yang mewakiliCollection
elemen yang dipesan dan masing-masing memiliki indeks numerik yang mewakili posisinya, di mana nol adalah elemen pertama, dan(length - 1)
merupakan yang terakhir.ArrayList
: AList
didukung oleh array, di mana array memiliki panjang (disebut "kapasitas") yang setidaknya sama besar dengan jumlah elemen ("ukuran" daftar). Ketika ukuran melebihi kapasitas (ketika(capacity + 1)-th
elemen ditambahkan), array diciptakan kembali dengan kapasitas baru(new length * 1.5)
- rekreasi ini cepat, karena digunakanSystem.arrayCopy()
. Menghapus dan menyisipkan / menambahkan elemen mengharuskan semua elemen tetangga (ke kanan) digeser ke dalam atau keluar dari ruang itu. Mengakses elemen apa pun dengan cepat, karena hanya memerlukan perhitungan(element-zero-address + desired-index * element-size)
untuk menemukan lokasi itu. Dalam sebagian besar situasi ,ArrayList
a lebih disukai daripada aLinkedList
.LinkedList
:List
Didukung oleh serangkaian objek, masing-masing ditautkan ke tetangga "sebelumnya" dan "berikutnya". ALinkedList
juga aQueue
danDeque
. Mengakses elemen dilakukan mulai dari elemen pertama atau terakhir, dan melintasi hingga indeks yang diinginkan tercapai. Penyisipan dan penghapusan, setelah indeks yang diinginkan tercapai melalui traversal adalah masalah sepele memetakan ulang hanya link tetangga langsung untuk menunjuk ke elemen baru atau memotong elemen yang sekarang dihapus.Map
: Antarmuka yang mewakili diCollection
mana setiap elemen memiliki "kunci" pengidentifikasi - setiap elemen adalah pasangan nilai kunci.HashMap
: A diMap
mana kunci tidak teratur, dan didukung oleh aHashtable
.LinkedhashMap
: Kunci dipesan berdasarkan urutan penyisipan .TreeMap
: A diMap
mana kunci dipesan olehComparator
(biasanya pemesanan alami).Queue
: Sebuah antarmuka yang mewakiliCollection
elemen tempat, biasanya, ditambahkan ke satu ujung, dan dihapus dari yang lain (FIFO: masuk pertama, keluar pertama).Stack
: Sebuah antarmuka yang mewakiliCollection
elemen tempat, biasanya, ditambahkan (didorong) dan dihapus (muncul) dari ujung yang sama (LIFO: last-in, first-out).Deque
: Pendek untuk "antrian ujung ganda", biasanya diucapkan "dek". Daftar tertaut yang biasanya hanya ditambahkan dan dibaca dari kedua ujung (bukan tengah).Diagram koleksi dasar:
Membandingkan penyisipan elemen dengan
ArrayList
danLinkedList
:sumber
Gambar yang lebih sederhana ada di sini. Disederhanakan dengan sengaja!
Koleksi adalah segala sesuatu yang menyimpan data yang disebut "elemen" (dari tipe yang sama). Tidak ada yang lebih spesifik yang dianggap.
Daftar adalahkumpulan data yang diindeks di mana setiap elemen memiliki indeks. Sesuatu seperti array, tetapi lebih fleksibel.
Data dalam daftar menjaga urutan penyisipan.
Operasi khas: dapatkan elemen ke-n.
Set adalah sekumpulan elemen , masing-masing elemen hanya sekali (elemen dibedakan menggunakan
equals()
metodemereka.Data dalam set sebagian besar disimpan hanya untuk mengetahui data apa yang ada.
Operasi khas: memberi tahu jika ada elemen dalam daftar.
Peta adalah sesuatu seperti Daftar, tetapi alih-alih mengakses elemen dengan indeks integernya, Anda mengaksesnya dengan kunci mereka, yang merupakan objek apa pun. Suka array dalam PHP :)
Data dalam Peta dapat dicari dengan kunci mereka.
Operasi khas: dapatkan elemen dengan ID-nya (di mana ID dari jenis apa pun, tidak hanya
int
seperti dalam Daftar).Perbedaannya
Atur dan Peta: di Mengatur Anda mencari data sendiri , sementara di Peta dengan kunci mereka .
Daftar dan Peta: di elemen Daftar Anda mengakses dengan
int
indeks mereka (posisi dalam Daftar), sementara di Peta dengan kunci mereka yang os dari jenis apa pun (biasanya: ID)Daftar dan Set: dalam Daftar elemen terikat oleh posisi mereka dan dapat digandakan, sedangkan di Set elemen hanya "hadir" (pr tidak ada) dan unik (dalam arti
equals()
, ataucompareTo()
untukSortedSet
)sumber
Ini sederhana: jika Anda perlu menyimpan nilai dengan kunci yang dipetakan untuk mereka pergi untuk antarmuka Peta, jika tidak gunakan Daftar untuk nilai yang dapat diduplikasi dan akhirnya menggunakan antarmuka Set jika Anda tidak ingin nilai digandakan dalam koleksi Anda.
Berikut ini penjelasan lengkapnya: http://javatutorial.net/choose-the-right-java-collection , termasuk flowchart dll
sumber
Peta
Jika memilih
Map
, saya membuat tabel ini merangkum fitur masing-masing dari sepuluh implementasi yang dibundel dengan Java 11.sumber
Koleksi umum, Koleksi umum
sumber
Koleksi Java mana yang harus saya gunakan?
Itu tergantung pada masalah apa yang Anda coba selesaikan atau persyaratan apa yang Anda miliki.
Contoh:
sumber