Ingat bahawa Peta ialah data berstruktur yang terdiri daripada set pasangan nilai kunci dan setiap kunci hanya boleh digunakan sekali dalam satu Peta. Topik ini merangkumi 9 soalan asas tentang menggunakan Peta dalam Java dan kelas yang dilaksanakannya. Untuk kesederhanaan, saya akan menggunakan generalisasi dalam contoh . Oleh itu, saya hanya akan menulis Peta, tanpa menyatakan penentu Peta. Tetapi anda boleh mengandaikan bahawa kedua-dua nilai K dan V adalah setanding, yang bermaksud K memanjang Sebanding dan V juga memanjang Sebanding .
0. Menukar Peta kepada Senarai
Di Java, antara muka Peta menawarkan tiga jenis koleksi: set kunci, set nilai dan set nilai kunci. Kesemuanya boleh ditukar menjadi Senarai menggunakan pembina atau kaedahaddAll()
. Coretan kod berikut menunjukkan cara membuat ArrayList daripada Peta.
// list of keys
List keyList = new ArrayList(Map.keySet());
//list of values
List valueList = new ArrayList(Map.valueSet());
//list key-value
List entryList = new ArrayList(Map.entrySet());
1. Gelung semua nilai dalam Peta
Berjalan melalui setiap pasangan nilai kunci ialah prosedur asas yang paling asas untuk berjalan melalui Peta. Di Jawa, setiap pasangan disimpan dalam medan Peta yang dipanggil Map.Entry .Map.entrySet()
mengembalikan satu set nilai-kunci, jadi cara yang paling berkesan untuk mengulangi semua nilai Peta ialah:
for(Entry entry: Map.entrySet()) {
//get the key
K key = entry.getKey();
//get value
V value = entry.getValue();
}
Kami juga boleh menggunakan Iterator
, terutamanya dalam versi yang lebih muda daripada JDK 1.5
Iterator itr = Map.entrySet().iterator();
while(itr.hasNext()) {
Entry entry = itr.next();
//get the key
K key = entry.getKey();
//get value
V value = entry.getValue();
}
2. Memesan Peta dengan Kekunci
Menyusun Peta mengikut kekunci adalah satu lagi prosedur yang biasa digunakan. Cara pertama ialah menambah Map.Entry pada senarai dan mengisih menggunakan pembanding yang mengisih mengikut nilai.List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {
@Override
public int compare(Entry e1, Entry e2) {
return e1.getKey().compareTo(e2.getKey());
}
});
Cara lain: gunakan SortedMap , yang, sebagai tambahan, turut menyusun kuncinya mengikut urutan. Tetapi, semua kunci mesti merangkumi Comparable atau diterima oleh pembanding. Salah satu kelas yang dilaksanakan SortedMap
ialah TreeMap . Pembinanya menerima pembanding. Kod berikut menunjukkan cara menukar yang biasa Map
kepada yang tertib.
SortedMap sortedMap = new TreeMap(new Comparator() {
@Override
public int compare(K k1, K k2) {
return k1.compareTo(k2);
}
});
sortedMap.putAll(Map);
3. Peta Susunan mengikut Nilai
Menambah Peta pada senarai dan kemudian menyusunnya berfungsi dalam kes ini, tetapi kali ini anda perlu menggunakanEntry.getValue()
. Kod di bawah hampir sama seperti sebelum ini.
List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {
@Override
public int compare(Entry e1, Entry e2) {
return e1.getValue().compareTo(e2.getValue());
}
});
Kami masih boleh menggunakannya SortedMap
dalam kes ini, tetapi hanya jika nilainya unik. Dalam kes ini, anda boleh menukar pasangan nilai kunci menjadi nilai kunci. Penyelesaian ini mempunyai had yang teruk dan tidak disyorkan oleh saya.
4. Memulakan Peta statik/tidak berubah
Apabila anda mahu Peta kekal tidak berubah, cara yang baik ialah menyalinnya ke Peta tidak berubah. Teknik pengaturcaraan pertahanan ini akan membantu anda membuat Peta yang bukan sahaja selamat untuk digunakan, tetapi juga selamat untuk benang. Untuk memulakan Peta statik/tidak berubah, kita boleh menggunakan pemulastatic
(lihat di bawah). Masalah dengan kod ini ialah walaupun mengisytiharkan Peta sebagai static final
, kita masih boleh bekerja dengannya selepas permulaan, contohnya Test.Map.put(3,"three");
. Jadi ia bukan kebolehubahan sebenar. Untuk mencipta Peta tidak berubah menggunakan pemula statik, kami memerlukan kelas super tanpa nama, yang akan kami tambahkan pada Peta tidak berubah pada langkah permulaan terakhir. Sila lihat bahagian kedua kod. Apabila UnsupportedOperationException akan dilemparkan jika anda menjalankan Test.Map.put(3,"three");
.
public class Test {
private static final Map Map;
static {
Map = new HashMap();
Map.put(1, "one");
Map.put(2, "two");
}
}
public class Test {
private static final Map Map;
static {
Map aMap = new HashMap();
aMap.put(1, "one");
aMap.put(2, "two");
Map = Collections.unmodifiableMap(aMap);
}
}
Pustaka Guava juga menyokong pelbagai cara untuk memulakan koleksi statik dan tidak berubah. Untuk mengetahui lebih lanjut tentang faedah utiliti koleksi tidak berubah Guava, lihat bahagian Koleksi Tidak berubah dalam Cara Cara Guava .
5. Perbezaan antara HashMap, TreeMap dan Hashtable
Terdapat tiga pelaksanaan utama antara muka Peta dalam Java: HashMap , TreeMap , dan Hashtable . Perbezaan utama adalah seperti berikut:- Urutan laluan . HashMap dan HashTable tidak menjamin pesanan Peta; khususnya, mereka tidak menjamin bahawa pesanan akan kekal sama dari semasa ke semasa. Tetapi
TreeMap
ia akan memerintahkan semua nilai dalam "tertib semula jadi" kekunci atau oleh pembanding. - Pasangan nilai kunci yang sah.
HashMap
membolehkan anda mempunyai kunci null dan nilai null.HashTable
tidak membenarkan kunci null atau nilai null. JikaTreeMap
susunan semula jadi digunakan atau pembanding tidak membenarkan kunci nol, pengecualian akan dibuang. - Penyegerakan . Hanya
HashTable
disegerakkan, selebihnya tidak. Tetapi, "jika pelaksanaan selamat benang tidak diperlukan, adalah disyorkan untuk menggunakan "HashMap
sebaliknyaHashTable
.
. | HashMap | HashTable | TreeMap
-------------------------------------------------------
Упорядочивание |нет |нет | да
null в ключ-meaning | да-да | нет-нет | нет-да
синхронизировано | нет | да | нет
производительность | O(1) | O(1) | O(log n)
воплощение | корзины | корзины | красно-чёрное дерево
Baca lebih lanjut tentang hubungan HashMap lwn . TreeMap lwn. Hashtable lwn. LinkedHashMap .
6. Peta dengan carian/pandangan terbalik
Kadangkala, kita memerlukan satu set pasangan kunci-kunci, yang bermaksud nilai-nilai adalah unik seperti kekunci (corak satu-satu). Konsistensi ini membolehkan anda membuat "pandangan/carian terbalik" pada Peta. Iaitu, kita boleh mencari kunci dengan nilainya. Struktur data ini dipanggil Peta dwiarah , yang malangnya tidak disokong oleh JDK. Kedua-dua Apache Common Collections dan Guava menawarkan pelaksanaan Peta dwiarah yang dipanggil BidiMap dan BiMap, masing-masing. Kedua-duanya memperkenalkan kekangan yang menguatkuasakan pemetaan 1:1 antara kunci dan nilai.7. Salinan cetek Peta
Hampir semua, jika tidak semua, Peta dalam Java mengandungi pembina salinan untuk Peta lain. Tetapi prosedur penyalinan tidak disegerakkan. Maksudnya apabila satu utas menyalin Peta, utas lain boleh mengubah strukturnya. Untuk mengelakkan penyahsegerakan salinan secara tiba-tiba, salah satu daripadanya hendaklah digunakan dalam kes sedemikianCollections.synchronizedMap()
.
Map copiedMap = Collections.synchronizedMap(Map);
Satu lagi cara menarik untuk menyalin secara cetek ialah menggunakan clone()
. Tetapi ia TIDAK disyorkan walaupun oleh pencipta rangka kerja koleksi Java, Joshua Bloch. Dalam perbahasan " Copy Constructor vs. Cloning ", dia mengambil pendirian: Petikan: "Saya sering memasukkan kaedah klon awam dalam kelas konkrit kerana orang ramai mengharapkan mereka berada di sana. ... memalukan bahawa Pengklonan rosak, tetapi ia berlaku. ... Pengklonan adalah titik lemah, dan saya fikir orang ramai harus diberi amaran tentang batasannya." Atas sebab ini, saya tidak menunjukkan kepada anda cara menggunakan kaedah clone()
untuk menyalin Peta
8. Buat Peta kosong
JikaMap
tidak berubah, gunakan:
Map = Collections.emptyMap();
Atau, gunakan sebarang penjelmaan lain. Sebagai contoh:
Map = new HashMap();
TAMAT
GO TO FULL VERSION