1. Satu set key-value pair.

Satu set key-value pair

Di Jawa, koleksi lain yang menarik (secara garis besar) adalah Map. Terkadang struktur data ini juga disebut kamus.

Ini mirip dengan Setkoleksi, tetapi menyimpan satu set "pasangan" elemen daripada satu set elemen, Setiap pasangan dalam a Mapterdiri dari dua elemen: "kunci" dan "nilai".

Katakanlah Anda ingin program Anda menyimpan nama karyawan dan gaji mereka, atau nama rekan kerja Anda dan usia mereka. Maka Anda akan membutuhkan tabel seperti ini:

Nama Usia
Elon 21
jef 22
Tagihan 48
Warren ?

Setiap baris berisi beberapa nilai. Kami akan merujuk nama sebagai kunci pasangan , dan usia sebagai nilai pasangan .

Seluruh rangkaian pasangan ini adalah peta kita ( Map).

Kunci pasangan bisa berupa apa saja kecuali null. Kunci harus unik: satu peta tidak boleh berisi dua kunci yang identik.


2. HashMapkelas

Kelas HashMapadalah jenis Mapkoleksi yang paling populer. Di satu sisi, ini sangat mirip dengan HashSet dan memiliki semua metodenya. Di sisi lain, ini seperti daftar ( ArrayList) yang dapat menggunakan kata (atau yang lainnya) sebagai indeksnya.

Anda dapat membuat HashMapmenggunakan pernyataan seperti ini:

HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();

Di mana KeyTypetipe kunci dalam pasangan yang disimpan, dan ValueTypetipe nilai dalam pasangan yang disimpan dalam HashMapkoleksi.

Kelas HashMapmemiliki metode seperti ini:

metode Keterangan
void put(KeyType key, ValueType value)
Menambahkan pasangan ( key, value) ke koleksi
ValueType get(KeyType key)
Mengembalikan nilai yang terkait dengan kunci.
boolean containsKey(KeyType key)
Memeriksa apakah ada kunci dalam koleksi
boolean containsValue(ValueType value)
Memeriksa keberadaan nilai dalam koleksi
ValueType remove(KeyType key)
Menghapus elemen dari koleksi
void clear()
Membersihkan koleksi, menghapus semua elemen
int size()
Mengembalikan jumlah key-value pair dalam koleksi
Set<KeyType> keySet()
Mengembalikan set kunci dalam koleksi
Collection<ValueType> values()
Mengembalikan set yang berisi elemen koleksi
Set<Map.Entry<KeyType, ValueType>> entrySet()
Mengembalikan satu set ( Set) dari semua pasangan ( Map.Entry) dalam koleksi.

Menambahkan elemen ke aHashMap

Elemen ditambahkan ke peta sebagai pasangan menggunakan put()metode ini. Kunci diteruskan sebagai argumen pertama, dan nilainya diteruskan sebagai argumen kedua.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

Saat menambahkan key-value pair, jika kunci sudah ada di koleksi, maka nilai lama akan diganti dengan nilai baru.

Perilaku ini membuat HashMapseperti array atau daftar yang indeksnya adalah kata ( String) bukan angka.

Penting:

Hampir semua tipe bisa menjadi KeyType atau ValueType. Ada beberapa persyaratan tambahan kecil untuk KeyType, dan Anda akan mempelajarinya saat mempelajari koleksi secara lebih mendetail dalam pencarian Java Collections.



3. Subset dari a HashMap: himpunan kunci

Katakanlah kita hanya ingin menampilkan semua entri di HashMaplayar. Bagaimana kita melakukan ini? Untuk melakukan ini, kita perlu mengetahui bagaimana menelusuri semua entri dalam file HashMap. Hal ini dapat dilakukan dengan beberapa cara.

Cara termudah adalah dengan mengulang kunci

HashMapentri tidak diberi nomor secara berurutan, jadi loop dengan penghitung tidak akan berfungsi di sini. Tapi kita bisa mendapatkan satu set kunci menggunakan keySet()metode ini, dan Anda sudah tahu cara mengulang satu set:

Kode Keterangan
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}






Ulangi kunci map

Dapatkan nilai yang terkait dengan kunci

Metode keySet()mengembalikan satu set kunci. Anda dapat menggunakan set ini dengan dua cara:

Notasi kompak Notasi panjang
for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}
Set<String> keys = map.keySet();

for (String key: keys)
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}


4. Mengulang pasangan kunci-nilai

Ada juga cara yang lebih rumit: Anda bisa mengubah a Mapmenjadi sekumpulan key-value pair , lalu mengulangi elemen himpunan, seperti yang telah kita pelajari.

Koleksi HashMapmemiliki kelas pembantu yang menyimpan pasangan kunci-nilai. Tampilannya kira-kira seperti ini:

class Entry<KeyType, ValueType>
{
   private KeyType key;
   private ValueType value;

   public KeyType getKey()
   {
      return this.key;
   }

   public ValueType getValue()
   {
      return this.value;
   }
}

Hasil pemanggilan entrySet()metode pada objek akan menjadi :HashMap<KeyType, ValueType>Set<Entry<KeyType, ValueType>>

Set<Entry<KeyType, ValueType>> name = map.entrySet();

Di sini kita memiliki Setkelas generik dengan parameter tipe, yang pada gilirannya adalah tipe generik ( Entry) dengan dua parameter tipe.

Sangat mudah bagi pemula untuk bingung tentang hal ini. Tetapi begitu Anda mengetahuinya, Anda dapat menulis kode seperti:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Konon, kode ini bisa sedikit disederhanakan:

Pertama, Anda dapat melewati pembuatan variabel terpisah untuk entriesdan alih-alih memanggil entrySet()metode langsung di dalam forloop:

for(Map.Entry<String, Integer> pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Kedua, Anda dapat menggunakan operator yang baru diperkenalkan varuntuk secara otomatis menyimpulkan jenis pasangan nilai kunci :

for(var pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Tidak buruk, kan?



5. Perbandingan ArrayListdanHashMap

A HashMapsangat menyerupai an ArrayListyang memungkinkan string (atau jenis lainnya) untuk digunakan sebagai indeks (kunci).

Jika Anda menggunakan Integerkunci dalam a HashMap, maka itu menjadi lebih mirip dengan ArrayList. Mari kita bandingkan:

Kode dengan ArrayList<String> Kode dengan HashMap<Integer, String>
ArrayList<String> list = new ArrayList<String>();

list.add("Greetings");
list.add("Hello");

String s = list.get(0);
list.set(0, s + "!");

for (String item: list)
{
   System.out.println(item);
}
HashMap<Integer, String> map = new HashMap<Integer, String>();

map.put(0, "Greetings");
map.put(1, "Hello");

String s = map.get(0);
map.put(0, s + "!");

for (String item: map.values())
{
   System.out.println(item);
}