CodeGym /Java Blog /Acak /HashMap: peta macam apa ini?
John Squirrels
Level 41
San Francisco

HashMap: peta macam apa ini?

Dipublikasikan di grup Acak
Hai! Dalam pelajaran ini, kita akan meninjau lebih dekat di Java HashMap . Sebelumnya, kita telah mempelajari struktur data tempat elemen disimpan sebagai dirinya sendiri. Dalam sebuah array atau ArrayList / LinkedList , kami menyimpan sejumlah elemen. Tetapi bagaimana jika tugas kita sedikit berubah?
HashMap: peta macam apa ini?  - 1
Bayangkan tugas berikut: buat daftar 100 orang yang menyimpan nama dan nomor paspor setiap orang. Pada prinsipnya, ini tidak terlalu sulit. Misalnya, Anda dapat memasukkan keduanya ke dalam string, lalu membuat daftar string berikut: "Amelia Aguilar, 4211 717171". Tetapi solusi ini memiliki dua kelemahan. Pertama, kami mungkin memerlukan kemampuan untuk mencari berdasarkan nomor paspor. Dan ini akan bermasalah mengingat format penyimpanan informasi ini. Kedua, tidak ada yang menghentikan kami untuk membuat dua orang berbeda dengan nomor paspor yang sama. Dan ini adalah kekurangan paling serius dari solusi kami. Ini tidak boleh diizinkan: tidak ada dua orang yang memiliki nomor paspor yang sama. Struktur data baru membantu kami: Peta. Ini juga dikenal sebagai "array asosiatif", tetapi istilah ini jarang digunakan. Lebih umum, ini disebut "kamus" atau "peta". :) Apa perbedaan mendasarnya dengan struktur data yang telah kita pertimbangkan sebelumnya? Di atas segalanya, fakta bahwa data dalam Peta disimpan sebagai pasangan kunci-nilai. Apa pun dapat berfungsi sebagai kunci dan nilai: angka, string, atau objek dari kelas lain. Hari ini kita akan mempelajari penerapan kelas Map yang paling umum : Java HashMap . HashMap: peta macam apa ini?  - 2

Jadi, apa yang perlu kita ketahui tentang HashMap di Java?

Sangat mudah untuk membuat:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
Di sini kita membuat kamus yang menyimpan elemen sebagai pasangan "angka-string". Angka akan bertindak sebagai kunci, dan string sebagai nilainya. Kami juga menentukan jenis kunci (Integer) dan jenis nilai (String). Mengapa? Pertama, kunci HashMap selalu unik. Ini sangat cocok untuk kami, karena kami dapat menggunakan nomor paspor sebagai kunci dan menghindari duplikat. Nilainya akan berupa string dengan nama lengkap (orang yang berbeda dapat memiliki nama yang sama; tidak ada yang perlu kita khawatirkan). Menambahkan pasangan baru ke HashMap terlihat seperti ini:

public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);
   }
}
Kami menggunakan metode put() untuk ini. Selain itu, HashMap mengganti metode toString() , sehingga dapat ditampilkan di konsol. Keluarannya akan terlihat seperti ini: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan Agung} Sekarang mari kita verifikasi apakah kuncinya benar-benar unik? Mari coba tambahkan elemen baru dengan kunci yang sudah digunakan di peta:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Albert Kent");// This key has already been used
   System.out.println(passportsAndNames);
}
Keluaran: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} Seperti yang Anda lihat, nilai sebelumnya yang terkait dengan kunci 162348 telah ditimpa. Kami menggunakan istilah "kunci" karena suatu alasan. Nilai dalam HashMap diakses menggunakan kunci, tetapi tidak sebaliknya. Kunci tidak dapat diperoleh dengan menggunakan nilai, karena nilainya mungkin tidak unik. Ini terlihat jelas saat mendapatkan atau menghapus elemen dari HashMap :

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   String lidiaName = passportsAndNames.get(212133);
   System.out.println(lidiaName);

   passportsAndNames.remove(162348);
   System.out.println(passportsAndNames);
}
Untuk mendapatkan nilai atau menghapus pasangan dari kamus, kita harus meneruskan ke get() dan menghapus() kunci unik yang sesuai dengan nilai. Tidak seperti array dan daftar, HashMap di Java tidak memiliki indeks numerik: nilai diakses menggunakan kunci. Keluaran konsol: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} Kelas ArrayList dan LinkedList memungkinkan kita memeriksa apakah daftar berisi elemen tertentu . Java HashMap memungkinkan kita melakukan ini. Terlebih lagi, kita dapat melakukan ini untuk kedua anggota pasangan: Inilah yang berisiKey() (memeriksa kunci) dan berisiValue()(memeriksa nilai) metode adalah untuk.

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));
}
Output: false true Fitur nyaman lainnya dari HashMap di Java adalah kenyataan bahwa Anda bisa mendapatkan daftar terpisah dari semua kunci dan semua nilai. Ini dilakukan dengan metode keySet() dan values() :

public class Main {

   public static void main(String[] args) {
       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put (212133, "Bridget Logan");
       passportsAndNames.put (162348, "Ivan the Great");
       passportsAndNames.put(8082771, "Donald John Trump");

       Set keys = passportsAndNames.keySet();
       System.out.println("Keys: " + keys);

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);
   }
}
Kunci diekstrak ke dalam Set , yang belum kita bahas. Ini istimewa karena tidak dapat berisi elemen berulang. Sekarang hal utama yang harus diingat adalah bahwa daftar semua kunci dapat diambil dari HashMap ke dalam koleksi terpisah. Dalam contoh, kami menyimpan nilai ke dalam ArrayList biasa . Keluaran konsol: Tombol: [212133, 8082771, 162348] Nilai: [Bridget Logan, Donald John Trump, Ivan the Great] Metode size () dan clear() melakukan hal yang persis sama seperti pada struktur sebelumnya yang telah kita bahas: yang pertama mengembalikan jumlah elemen yang saat ini ada di kamus, yang kedua menghapus semua elemen.

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);
}
Keluaran: 3 {} Untuk memeriksa apakah setidaknya ada satu elemen di HashMap , kita bisa menggunakan metode isEmpty() :

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);
   }
}
Keluaran: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan yang Agung} Sekarang kita hanya akan mengeluarkan ke konsol setelah pemeriksaan awal. :) Poin menarik lainnya adalah dua Peta dapat digabungkan menjadi satu. Ini dilakukan dengan menggunakan metode putAll() . Kami menyebutnya di HashMap pertama , meneruskan yang kedua sebagai argumen, dan elemen dari yang kedua ditambahkan ke yang pertama:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put (212133, "Bridget Logan");
   passportsAndNames.put (162348, "Ivan the Great");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Clifford Patrick");
   passportsAndNames2.put(925648, "Mitchell Salgado");

   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);
}
Keluaran: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan the Great} Semua pasangan di passportsAndNames2 telah disalin ke passportsAndNames . Sekarang perhatikan contoh yang lebih rumit. Secara khusus, mengulangi HashMap dalam satu lingkaran.

for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
Kelas Map.Entry menunjukkan pasangan kunci-nilai di dalam kamus. Metode entrySet () mengembalikan daftar semua pasangan di HashMap kita . Karena peta kita terdiri dari pasangan Map.Entry ini , kita mengulangi pasangan, bukan kunci atau nilai yang terpisah. Keluaran: 212133=Bridget Logan 8082771=Donald John Trump 162348=Ivan Agung Juga, jangan lupa untuk mempelajari dokumentasi resmi Oracle untuk HashMap .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION