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?
java
iteration
linkedhashmap
pengguna256239
sumber
sumber
values()
jugakeySet()
, saya telah memperluas pertanyaan untuk memasukkan itu. Ini berarti lebih banyak pertanyaan dapat ditutup sebagai duplikat dari ini.Jawaban:
- Peta
- LinkedHashMap
Jadi, ya,
keySet()
,values()
, danentrySet()
(tiga pandangan koleksi disebutkan) kembali nilai-nilai dalam urutan daftar terkait penggunaan internal. Dan ya, JavaDoc untukMap
danLinkedHashMap
menjaminnya.Lagipula itulah inti dari kelas ini.
sumber
Collection
hanya kelas dasar untuk nilai apa () kembali. Implementasi dari Koleksi yang dikembalikan masih dikendalikan olehLinkedHashMap
. DalamLinkedHashMap
kasus ini, ia mengembalikanLinkedValues
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()
danentrySet()
semua menggunakan iterator entri yang sama secara internal.sumber
Jangan bingung
LinkedHashMap.keySet()
danLinkedHashMap.entrySet()
mengembalikan Set dan karenanya tidak menjamin pemesanan!Set
adalah antarmuka denganHashSet
,TreeSet
dll makhluk implementasinya. TheHashSet
pelaksanaanSet
antarmuka tidak menjamin pemesanan. NamunTreeSet
demikian. JugaLinkedHashSet
tidak.Oleh karena itu tergantung pada bagaimana
Set
telah diterapkanLinkedHashMap
untuk mengetahui apakah referensi Set kembali akan menjamin pemesanan atau tidak. Saya membaca kode sumbernyaLinkedHashMap
, terlihat seperti ini:Dengan demikian LinkedHashMap / HashMap memiliki implementasi sendiri
Set
yaituKeySet
. Jadi jangan bingung dengan iniHashSet
.Juga, urutan dipertahankan oleh bagaimana elemen-elemen dimasukkan ke dalam ember. Lihatlah
addEntry(..)
metodeLinkedHashMap
dan membandingkannya denganHashMap
yang menyoroti perbedaan utama antaraHashMap
danLinkedHashMap
.sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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.