Saya tahu LinkedHashMap
memiliki urutan iterasi yang dapat diprediksi (urutan pemasangan). Apakah yang Set
dikembalikan oleh LinkedHashMap.keySet()
dan Collection
dikembalikan LinkedHashMap.values()
juga mempertahankan pesanan ini?
Saya tahu LinkedHashMap
memiliki urutan iterasi yang dapat diprediksi (urutan pemasangan). Apakah yang Set
dikembalikan oleh LinkedHashMap.keySet()
dan Collection
dikembalikan LinkedHashMap.values()
juga mempertahankan pesanan ini?
Jawaban:
Antarmuka Peta menyediakan tiga tampilan koleksi , yang memungkinkan konten peta dilihat sebagai satu set kunci, kumpulan nilai, atau set pemetaan nilai kunci. The rangka dari peta didefinisikan sebagai urutan iterator pada pandangan koleksi peta ini kembali elemen mereka. Beberapa implementasi peta, seperti
TreeMap
kelas, membuat jaminan khusus untuk pesanan mereka; yang lain, sepertiHashMap
kelas, tidak.
- Peta
Daftar tertaut ini mendefinisikan urutan iterasi, yang biasanya merupakan urutan kunci yang dimasukkan ke dalam peta ( urutan penyisipan ).
Jadi, ya, keySet()
, values()
, dan entrySet()
(tiga pandangan koleksi disebutkan) kembali nilai-nilai dalam urutan daftar terkait penggunaan internal. Dan ya, JavaDoc untuk Map
dan LinkedHashMap
menjaminnya.
Lagipula itulah inti dari kelas ini.
Collection
hanya kelas dasar untuk nilai apa () kembali. Implementasi dari Koleksi yang dikembalikan masih dikendalikan oleh LinkedHashMap
. Dalam LinkedHashMap
kasus ini, ia mengembalikan LinkedValues
instance, kelas privat di dalam LinkedHashMap.java.
Map
) yang secara eksplisit mengikat urutan peta ke iterator pada tampilan koleksi peta (dan memperjelas apa tampilan koleksi itu). Itu adalah bagian yang hilang untuk saya.
Melihat sumbernya, sepertinya memang demikian. keySet()
,, values()
dan entrySet()
semua menggunakan iterator entri yang sama secara internal.
Jangan bingung LinkedHashMap.keySet()
dan LinkedHashMap.entrySet()
mengembalikan Set dan karenanya tidak menjamin pemesanan!
Set
adalah antarmuka dengan HashSet
, TreeSet
dll makhluk implementasinya. The HashSet
pelaksanaan Set
antarmuka tidak menjamin pemesanan. Namun TreeSet
demikian. Juga LinkedHashSet
tidak.
Oleh karena itu tergantung pada bagaimana Set
telah diterapkan LinkedHashMap
untuk mengetahui apakah referensi Set kembali akan menjamin pemesanan atau tidak. Saya membaca kode sumbernya LinkedHashMap
, terlihat seperti ini:
private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}
Dengan demikian LinkedHashMap / HashMap memiliki implementasi sendiri Set
yaitu KeySet
. Jadi jangan bingung dengan ini HashSet
.
Juga, urutan dipertahankan oleh bagaimana elemen-elemen dimasukkan ke dalam ember. Lihatlah addEntry(..)
metode LinkedHashMap
dan membandingkannya dengan HashMap
yang menyoroti perbedaan utama antara HashMap
dan LinkedHashMap
.
Anda bisa berasumsi begitu. Javadoc mengatakan 'urutan iterasi yang dapat diprediksi', dan satu-satunya iterator yang tersedia di Peta adalah yang untuk keySet (), entrySet (), dan nilai ().
Jadi dengan tidak adanya kualifikasi lebih lanjut itu jelas dimaksudkan untuk berlaku untuk semua iterator tersebut.
AFAIK tidak didokumentasikan sehingga Anda tidak dapat "secara formal" menganggapnya demikian. Namun, kecil kemungkinan implementasi saat ini akan berubah.
Jika Anda ingin memastikan pesanan, Anda mungkin ingin mengulangi atas peta yang masuk dan memasukkannya ke dalam set yang diurutkan dengan fungsi pesanan pilihan Anda, meskipun Anda akan membayar biaya kinerja, secara alami.
Melihat antarmuka itu mengembalikan polos Set
dan bukanSortedSet
. Jadi tidak ada jaminan.
Sebelum mengasumsikan jaminan implisit dengan melihat implementasi (selalu ide yang buruk) juga melihat implementasi di semua implementasi Java lainnya :)
Anda bisa membuat misalnya TreeSet dengan keySet di konstruktor.
Saya tidak berpikir Anda bisa menganggap pemesanan keySet () dan nilai ().
Saya dapat dengan mudah menulis implementasi LinkedHashMap yang mengembalikan Anda keySet () dan nilai () yang tidak terurut, selama saya tetap menggunakan kontrak dari kedua metode yang didefinisikan dalam Peta, dan diganti di HashMap.
LinkedHashMap
kelas adalah untuk menjaga urutan elemen saat iterasi peta dan perilaku ini ditentukan dengan baik. Jika Anda menulis subclass tanpa mematuhi spesifikasi kelas dasar, maka Anda melakukan sesuatu yang sangat salah.
values()
jugakeySet()
, saya telah memperluas pertanyaan untuk memasukkan itu. Ini berarti lebih banyak pertanyaan dapat ditutup sebagai duplikat dari ini.