Antarmuka Java Map adalah bagian dari kerangka Java Collection, tetapi bukan merupakan subtipe dari antarmuka Collection. Jadi itu berperilaku berbeda dibandingkan dengan, katakanlah, Daftar, atau Objek koleksi lainnya. Setiap elemen Map<Key, Value> mewakili pasangan kunci-nilai. Baik Kunci dan nilai adalah beberapa objek. Semua kunci di peta tertentu adalah unik, sedangkan nilainya tidak, sehingga dapat diduplikasi. Anda mungkin menganggap Map di Java seperti sejenis kamus atau katalog toko online, tempat Anda dapat menemukan item apa pun menggunakan indeks uniknya. Kuncinya adalah pengidentifikasi unik dari nilai di Peta. Misalnya di Map<String, Item> String adalah ID dari beberapa Item dari toko online. Menurut dokumentasi Map memiliki Subinterfaces berikutnya:
Binding ;
ConcurrentMap<K,V> ;
ConcurrentNavigableMap<K,V> ;
Konteks Pesan Logis ;
PesanKonteks ;
NavigableMap<K,V> ;
SOAPMessageContext ;
SortedMap<K,V> .
Dan Mengimplementasikan Kelas:
Peta Abstrak
Atribut
AuthProvider
ConcurrentHashMap
ConcurrentLewatiListMap
EnumMap
HashMap
Hashtable
IdentityHashMap
LinkedHashMap
PrinterStateReason
Properti
Pemberi
RenderingHints
SimpleBindings
Dukungan Data Tabular
Peta Pohon
UIDefault
LemahHashMap
Java AbstractMap adalah kelas abstrak yang mengimplementasikan sebagian besar antarmuka Peta.
Java HashMap adalah struktur data untuk menyimpan pasangan kunci-nilai menggunakan tabel hash.
Java TreeMap adalah struktur data yang menggunakan pohon, yaitu tampilan dengan kunci yang diurutkan.
WeakHashMap untuk menggunakan tabel hash dengan kunci lemah, tampilkan dengan nilai yang dapat dihapus oleh pengumpul sampah jika tidak lagi digunakan.
LinkedHashMap adalah peta dengan urutan penambahan elemen, memungkinkan iterasi dalam urutan penyisipan.
EnumMap memperluas kelas AbstractMap untuk digunakan dengan kunci enum.
IdentityHashMap menggunakan pemeriksaan kesetaraan referensi saat membandingkan dokumen, memetakan dengan kunci dibandingkan menggunakan operasi
== alih-alih metode
equals()
Di sini kami tertarik pada implementasi Antarmuka Peta yang paling populer: HashMap, TreeMap, dan LinkedHashMap. Omong-omong, urutan elemen peta bergantung pada implementasi tertentu. Katakanlah, TreeMap dan LinkedHashMap memiliki urutan elemen yang dapat diprediksi, sedangkan HashMap tidak.
Metode peta
Operasi utama dari setiap Peta adalah penyisipan, penghapusan, dan pencarian elemen.
public Object put(Object key, Object value) menyisipkan elemen ke dalam peta.
public void putAll(Map map) menyisipkan peta yang ditentukan di dalam peta.
public Object remove(Object key) menghapus entri sesuai dengan kunci yang ditentukan.
public Object get(Object key) mengembalikan nilai untuk kunci yang ditentukan.
public boolean containsKey(Object key) mencari kunci yang ditentukan dari peta ini
public Set keySet() mengembalikan tampilan Set yang berisi semua kunci
public Set entrySet() mengembalikan tampilan Set dengan semua kunci dan nilai.
Apa itu HashMap
Apa itu HashMap? Ini adalah implementasi paling populer dari antarmuka Map<Key,Value>. Struktur data ini didasarkan pada prinsip hashing.
Prinsip utama kerja HashMap: hashing
Untuk memahami apa itu hashmap dan cara kerjanya, mari kita bahas tentang fungsi hashing dan hash terlebih dahulu. Fungsi hash hanyalah fungsi dalam arti matematika. Jadi ada beberapa nilai input (objek, sepotong data) dan fungsi mengubahnya menggunakan aturan yang tepat menjadi nilai output - sebuah hash. Seringkali hash adalah angka heksadesimal dengan panjang yang sesuai. Aturan proses konversi bisa berbeda, tetapi tunduk pada prinsip-prinsip berikut:
Input (objek) tertentu memiliki kode hash tertentu.
Jika dua objek sama, kode hashnya juga sama. Kebalikannya tidak benar.
Jika kode hash berbeda, objek pasti tidak sama.
Terkadang objek yang berbeda dapat memiliki kode hash yang sama. Ini adalah peristiwa yang sangat tidak mungkin, bernama "tabrakan" dan fungsi hash yang berkualitas baik harus meminimalkan kemungkinan tabrakan.
Di Jawa, setiap objek memiliki kode hash. Itu dihitung dengan metode hashCode dari kelas Object, kelas parental dari semua Objek Java. Biasanya, pengembang mengganti metode ini untuk kelas mereka sendiri dan juga metode equals yang terkait dengannya.
HashMap: cara kerjanya
Jadi Kelas HashMap<K,V> karena setiap implementasi Peta terdiri dari kunci dan nilai. Ini menyimpan kunci menggunakan prinsip hashing. Di dalam pasangan nilai Kunci HashMap disimpan dalam "ember", ember ini bersama-sama membangun "tabel", sebuah array internal dari daftar tertaut dan ukuran awalnya adalah 16. HashMap di Java menggunakan kode hash kunci untuk menentukan keranjang tempat pasangan kunci/nilai harus dipetakan: Fitur rumit dari HashMap adalah bahwa setiap sel (keranjang) tabel [] menyimpan tidak hanya satu pasangan tetapi beberapa. Mereka tidak disimpan sebagai objek eksplisit (seperti LinkedList), tetapi sebagai rantai implisit. Rantai dibuat karena fakta bahwa setiap pasangan menyimpan tautan ke pasangan berikutnya. Artinya, semua pasangan HashMap tersebar di 16 rantai. Saat Anda memasukkan pasangan baru ke dalam tabel, hash kunci dipertimbangkan. Hash ini bukan fungsi kode hash yang dibangun ke dalam objek kunci. Itu dianggap berada di kisaran 0-15. Pasangan ditambahkan ke rantai pasangan yang disimpan dalam ember dengan indeks hash. Pendekatan ini memberi kita percepatan pencarian. Saat mencari pasangan dengan kunci, tidak perlu menelusuri seluruh tabel. Hash dari kunci dipertimbangkan dan hanya rantai yang disimpan dalam sel dengan indeks hash yang diperiksa. Jika ada terlalu banyak pasangan di HashMap, rantai menjadi terlalu panjang. Kemudian ukuran array bertambah, hash dari semua objek yang disimpan dihitung ulang, dan tersebar di sepanjang rantai baru.
Deklarasi HashMap
Jika Anda pergi ke kelas kode HashMap Anda akan menemukan deklarasi berikutnya:
public class HashMap extends AbstractMap implements Map, Cloneable, Serializable
Di mana K adalah jenis kunci yang dipertahankan oleh peta ini dan V adalah jenis nilai yang dipetakan. Ini adalah contoh deklarasi HashMap dengan kunci Integer dan nilai String dalam kode Anda:
HashMap<Integer, String> myHashMap = new HashMap<Integer, String>();
Metode HashMap
Berikut adalah daftar metode HashMap.
Object get(Object key) mengembalikan nilai untuk kunci yang ditentukan;
Objek put(Kunci k, Nilai v) menyisipkan pemetaan nilai kunci ke dalam peta;
Hapus objek(Object key) menghapus pemetaan untuk kunci yang ditentukan dari peta ini jika ada;
void clear() menghapus semua pasangan kunci-nilai dari HashMap;
Object clone() mengembalikan salinan dangkal dari instance HashMap ini tanpa mengkloning kunci dan nilai;
boolean containsKey(Object key) mengembalikan true jika kunci yang ditentukan ditemukan di peta, false jika tidak;
boolean containsValue(Object Value) mengembalikan true jika kunci yang ditentukan ditemukan di peta, false jika tidak;
boolean isEmpty() mengembalikan true jika peta kosong, false jika tidak;
Set keySet() mengembalikan Set kunci yang diambil dari peta;
int size() mengembalikan jumlah pemetaan nilai kunci;
Collection values() mengembalikan kumpulan nilai peta;
Hapus objek(Object key) menghapus pasangan kunci-nilai untuk kunci yang ditentukan;
void putAll(Map m) menyalin semua elemen peta ke peta lainnya.
Contoh Java HashMap
Mari kita buat program dengan Java HashMap Contoh untuk mendemonstrasikan cara kerjanya:
import java.util.HashMap;
import java.util.Map;
import java.util.Iterator;
import java.util.Set;
public class HashMap {
public static void main(String[] args) {
{
// HashMap declaration
HashMap<Integer, String> myHashMap = new HashMap<Integer, String>();
//Adding elements into HashMap
myHashMap.put(7, "Johnny");
myHashMap.put(8, "Ivy");
myHashMap.put(1, "Rick");
myHashMap.put(4, "Stan");
myHashMap.put(3, "Kyle");
//print out the map content using Iterator
Set set = myHashMap.entrySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Map.Entry mapEntry = (Map.Entry) iterator.next();
System.out.print("key: " + mapEntry.getKey() + " value: ");
System.out.println(mapEntry.getValue());
}
System.out.println("get an element from myHashMap via key and print the value out:");
System.out.println(myHashMap.get(8));
//print out hashMap on standard way:
System.out.println(myHashMap);
// Get values based on key
String var = myHashMap.get(2);
//here we'll get null, we don't have such a key
System.out.println("Value with key 2: " + var);
var = myHashMap.get(7);
System.out.println("Value with key 7: " + var);
// Remove values based on key
myHashMap.remove(4);
System.out.println("myHashMap after removing element:");
System.out.println(myHashMap);
myHashMap.clear();
System.out.println("myHashMap after total clearing:");
System.out.println(myHashMap);
}
}
}
Hasil menjalankan program:
key: 1 value: Rick
key: 3 value: Kyle
key: 4 value: Stan
key: 7 value: Johnny
key: 8 value: Ivy
get an element from myHashMap via key and print the value out:
Ivy
{1=Rick, 3=Kyle, 4=Stan, 7=Johnny, 8=Ivy}
Value with key 2: null
Value with key 7: Johnny
myHashMap after removing element:
{1=Rick, 3=Kyle, 7=Johnny, 8=Ivy}
myHashMap after total clearing:
{}
Peta Pohon
TreeMap di Java juga mengimplementasikan antarmuka Map<Key,Value>, tetapi didasarkan pada struktur data pohon Merah-Hitam. Pohon terdiri dari "simpul" dan garis yang menghubungkan simpul - cabang". Simpul "akar" berada di bagian atas pohon. Dari akar, bisa ada cabang dan simpul. Ini adalah struktur hierarkis, Anda mungkin memikirkannya simpul ini sebagai "anak" dari akar. Simpul anak dapat memiliki anak sendiri - simpul yang lebih rendah. Simpul tanpa anak disebut "simpul akhir" atau "daun". Pohon biner adalah pohon, di mana setiap simpul memiliki nol, satu , atau dua anak. Pohon pencarian biner adalah sebuah struktur, di mana setiap node internal menyimpan kunci, dan terkadang nilai terkait, dan memiliki dua sub-pohon yang berbeda ("kiri" dan "kanan"). Pohon pencarian biner self-balancing adalah pohon pencarian biner berbasis node yang secara otomatis menjaga ketinggiannya (jumlah maksimal level di bawah akar) kecil dalam menghadapi penyisipan dan penghapusan item yang sewenang-wenang. Pohon merah-hitam adalah pohon biner seimbang dengan sifat-sifat:
Setiap simpul berwarna merah atau hitam
Akarnya selalu hitam
Setiap daun adalah simpul NIL (jenis kosong, nol) dan berwarna hitam
Jika sebuah simpul berwarna merah, anak-anaknya pasti berwarna hitam.
Setiap jalur sederhana dari simpul ke daun turunan berisi jumlah simpul hitam yang sama.
Fitur TreeMap
TreeMap menggunakan struktur data pohon untuk menyimpan kunci sebagai simpul dan mengurutkan kunci menggunakan algoritma Pohon Merah-Hitam. Jadi, TreeMap menyimpan entri-entrinya yang diurutkan sesuai dengan urutan natural dari kunci-kuncinya. Untuk angka natural adalah urutan menaik, untuk string — urutan abjad. Anda dapat menggunakan pembanding jika Anda perlu mengubah logika pemesanan. Menyortir objek secara alami adalah keuntungan besar dari TreeMap, serta menemukan beberapa objek menggunakan filter dan kondisi yang berbeda.
Metode TreeMap
Object get(Object key) mengembalikan nilai kunci yang sesuai;
Object put(Object key, Object value) menyisipkan pemetaan ke dalam peta;
Penghapusan objek(Object key) menghapus pemetaan untuk kunci ini jika TreeMap memuatnya;
boolean containsKey(Object key) mengembalikan true jika peta ini berisi pemetaan untuk kunci yang ditentukan;
boolean containsValue(Object value) mengembalikan true jika TreeMap memetakan satu atau lebih kunci ke nilai yang ditentukan;
Object firstKey() mengembalikan kunci pertama yang saat ini ada di peta yang diurutkan;
Objek lastKey() mengembalikan kunci terakhir yang saat ini ada di peta yang diurutkan;
void putAll(Map map) menyalin semua pemetaan dari peta yang ditentukan ke peta;
Set entrySet() mengembalikan tampilan set pemetaan
int size() mengembalikan jumlah pemetaan nilai kunci
Collection values() mengembalikan tampilan koleksi dari nilai
Object clone() mengembalikan salinan TreeMap yang dangkal
void clear() menghapus semua pemetaan dari TreeMap
SortedMap headMap(Object key_value) mengembalikan tampilan porsi peta yang kurang dari parameter key_value
Set keySet() mengembalikan tampilan Set dari kunci yang terdapat dalam peta hierarki
SortedMap subMap(K fromKey, K toKey) mengembalikan tampilan bagian peta ini yang kuncinya berkisar dari fromKey, inklusif, hingga toKey, eksklusif
Object firstKey() mengembalikan kunci pertama dari TreeMap.
Contoh TreeMap
import java.util.TreeMap;
import java.util.Set;
import java.util.Iterator;
import java.util.Map;
public class TreeMapExample {
public static void main(String args[]) {
//TreeMap declaration
TreeMap<Integer, String> myTreeMap = new TreeMap<Integer, String>();
//put elements to TreeMap
myTreeMap.put(1, "Stuart");
myTreeMap.put(23, "Michael");
myTreeMap.put(7, "Johnny");
myTreeMap.put(5, "Ivy");
myTreeMap.put(2, "Alex");
//Display and print out myTreeMap using Iterator
Set set = myTreeMap.entrySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Map.Entry myEntry = (Map.Entry) iterator.next();
System.out.print("key: " + myEntry.getKey() + " value: ");
System.out.println(myEntry.getValue());
}
//TreeMap printed in classical way
System.out.println(myTreeMap);
//removing an element with the key =2
myTreeMap.remove(2);
//myTreeMap after removing:
System.out.println(myTreeMap);
}
}
Hasil menjalankan program:
key: 1 value: Stuart
key: 2 value: Alex
key: 5 value: Ivy
key: 7 value: Johnny
key: 23 value: Michael
{1=Stuart, 2=Alex, 5=Ivy, 7=Johnny, 23=Michael}
{1=Stuart, 5=Ivy, 7=Johnny, 23=Michael}
LinkedHashMap
LinkedHashMap adalah struktur data yang menggabungkan daftar tertaut dan peta hash. Memang, LinkedHashMap memperluas kelas HashMap dan mengimplementasikan antarmuka Peta, tetapi ada apa dengan daftar tertaut? Deklarasi LinkedHashMap:
Map <Integer, String> linkedHashMap = new LinkedHashMap <Integer, String>();
LinkedHashMap baru ini mewarisi properti dari HashMap (seperti tabel, loadFactor, threshold, size, entrySet), juga mendapatkan dua properti khusus:
header adalah kepala dari daftar tertaut ganda. Selama inisialisasi, ini menunjukkan dirinya sendiri
accessOrder menunjukkan cara mendapatkan akses ke elemen menggunakan iterator. Jika benar, di urutan akses terakhir. Jika salah, akses akan sesuai dengan urutan elemen yang dimasukkan.
Daftar tertaut ini menentukan urutan iterasi. Biasanya, ini adalah urutan penyisipan kunci ke dalam peta.
Metode LinkedHashMap
Object get(Object key) mengembalikan nilai ke mana kunci yang ditentukan dipetakan, atau null jika peta ini tidak berisi pemetaan untuk kunci
void clear() menghapus semua pemetaan dari peta.
boolean containsKey(Object key) mengembalikan true jika elemen yang ditentukan dipetakan oleh satu atau lebih kunci
boolean removeEldestEntry(Map.Entry eldest) mengembalikan nilai true jika peta menghapus entri tertua dari peta
Set<Map.Entry<K,V>> entrySet() mengembalikan tampilan Set dari pemetaan yang terdapat dalam peta ini
void forEach(BiConsumer<? super K,? super V> action) melakukan tindakan yang diberikan untuk setiap entri di peta ini hingga semua entri diproses atau tindakan melontarkan pengecualian.
Objek getOrDefault(Object key, V defaultValue) mengembalikan nilai ke mana kunci yang ditentukan dipetakan. Jika peta tidak berisi pemetaan untuk kunci mengembalikan defaultValue.
Set<K> keySet() mengembalikan tampilan Set dari kunci yang ada di peta
boolean removeEldestEntry(Map.Entry<K,V> eldest) mengembalikan nilai true jika peta ini harus menghapus entri tertuanya
void replaceAll(BiFunction<? super K,? super V,? extends V> function) mengganti setiap nilai entri dengan hasil pemanggilan fungsi yang diberikan pada entri tersebut sampai semua entri telah diproses atau fungsi melontarkan pengecualian.
Collection<v>values() mengembalikan tampilan Collection dari nilai yang terdapat di peta
Contoh LinkedHashMap
import java.util.LinkedHashMap;
import java.util.Set;
import java.util.Iterator;
import java.util.Map;
public class HashLinkedListExample {
public static void main(String args[]) {
// LinkedHashMap Declaration
LinkedHashMap<Integer, String> myLinkedHashMap =
new LinkedHashMap<Integer, String>();
//Adding elements into LinkedHashMap
myLinkedHashMap.put(7, "Johnny");
myLinkedHashMap.put(12, "Rick");
myLinkedHashMap.put(1, "Kyle");
myLinkedHashMap.put(5, "Percy");
myLinkedHashMap.put(85, "Sebastian");
// Generate a Set of entries
Set set = myLinkedHashMap.entrySet();
// Display and print out the nodes of LinkedHashMap
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
Map.Entry me = (Map.Entry)iterator.next();
System.out.print("key: "+ me.getKey() +
" value: "+me.getValue()+"\n");
}
//print out HashLinkedMap on standard way:
System.out.println(myLinkedHashMap);
myLinkedHashMap.put(21, "Ivy");
System.out.println(myLinkedHashMap);
myLinkedHashMap.remove(12);
System.out.println(myLinkedHashMap);
myLinkedHashMap.put(12, "Ronny");
System.out.println(myLinkedHashMap);
myLinkedHashMap.put(1, "Stan");
System.out.println(myLinkedHashMap);
}
}
Di sini kita membuat LinkedHashMap baru, menambahkan lima elemen, lalu mencetaknya menggunakan iterator dan dengan cara klasik. Seperti yang Anda lihat, LinkedHashMap mempertahankan urutan penyisipan. Setelah itu kami menghapus elemen dari Peta kami, lalu menambahkan yang baru dan kemudian - elemen lain dengan kunci yang sudah ada di peta. Itu menggantikan nilai lama yang dipetakan ke kunci ini. Hasil menjalankan program:
HashMap, TreeMap, dan LinkedHashMap adalah implementasi dari antarmuka Peta. HashMap dan LinkedHashMap adalah struktur data yang memiliki kunci hash. TreeMap menggunakan urutan alami kuncinya untuk mengatur pohon pencarian. Memesan:
HashMap tidak mempertahankan pesanan apa pun.
TreeMap mengurutkan entri dalam urutan kunci yang menaik.
LinkedHashMap mempertahankan urutan penyisipan.
Kunci kosong:
HashMap dan LinkedHashMap memungkinkan memiliki satu kunci nol.
LinkedHashMap tidak mengizinkan kunci nol jika kunci menggunakan pengurutan alami atau Pembanding tidak mendukung perbandingan pada ley nol.
Mari kita lihat contoh peta Java yang menyertakan ketiga implementasi yang diulas dalam artikel ini:
Seperti yang bisa kita lihat, urutan elemen di HashMap tidak jelas, di treeMap tergantung pada kunci, di LinkedHashMap tentang urutan penyisipan. Jika kami mencoba memasukkan kunci nol ke linkedHashMap, kami akan mendapatkan NullPointerException, tetapi di linkedHashMap1, di mana kuncinya adalah String, kami dapat melakukannya. Peta hash adalah implementasi peta tujuan umum terbaik. Ini memberikan kecepatan pencarian maksimum, penyimpanan cepat, dan operasi pengambilan, tetapi Anda harus ingat tentang urutannya yang kacau. Peta hash tertaut mewarisi keunggulan HashMap dan mendapatkan pesanan untuk kuncinya. Namun, itu berisi linkedList, yang relatif mahal dalam hal memori. itu lebih lambat dari HashMap dalam mencari dan sedikit lebih lambat untuk menambah/menghapus karena memelihara daftar tertaut. Peta pohon menyimpan kunci yang diurutkan dalam urutan menaik. Namun, Untuk memperkuat apa yang Anda pelajari, kami sarankan Anda menonton video pelajaran dari Kursus Java kami
GO TO FULL VERSION