JavaRush /Java Blog /Random-ID /HashMap di Java - jenis peta apa itu?

HashMap di Java - jenis peta apa itu?

Dipublikasikan di grup Random-ID
Halo! Hari ini kita akan berbicara tentang struktur data lain - Peta. Nama resminya di Rusia adalah “array asosiatif”, tetapi tidak sering digunakan. Opsi yang lebih umum adalah "kamus", "peta", atau (paling sering) bahasa gaul anglicisme "peta" :) Di dalam Peta, data disimpan dalam format "kunci" - "nilai", yaitu berpasangan. Kunci dan nilai dapat berupa objek apa saja—angka, string, atau objek kelas lain.

Perbedaan Peta dengan struktur data lainnya

Sebelumnya, kita melihat struktur data tempat elemen disimpan sendiri. Dalam sebuah array, atau ArrayList / LinkedList , kami menyimpan sejumlah elemen tertentu. Namun bagaimana jika tugas kita sedikit berubah? Misalnya kita dihadapkan pada tugas membuat daftar 100 orang, yang di dalamnya akan disimpan nama lengkap dan nomor paspor orang tersebut. Pada prinsipnya tidak terlalu sulit. Misalnya, Anda dapat memasukkan keduanya ke dalam satu baris dan membuat daftar baris seperti ini: “Anna Ivanovna Reshetnikova, 4211 717171.” Namun solusi ini memiliki dua kelemahan. Pertama, kita mungkin memerlukan fungsi pencarian paspor. Dan dengan format penyimpanan informasi seperti ini, ini akan menjadi masalah. Dan kedua, tidak ada yang menghalangi kita untuk membuat dua orang berbeda dengan nomor paspor yang sama. Dan inilah kelemahan paling serius dari solusi kami. Situasi seperti itu harus dikecualikan sepenuhnya, tidak ada dua orang dengan nomor paspor yang sama. Di sini Peta dan fitur-fiturnya membantu kami (menyimpan data berpasangan dalam format "kunci" - "nilai"). Mari kita lihat implementasi Map yang paling umum - kelas Java HashMap .HashMap - peta macam apa ini?  - 1

Membuat HashMap di Java dan bekerja dengan kelas

Implementasi ini sangat sederhana untuk dibuat:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

}
Di sini kami telah membuat kamus di mana elemen akan disimpan dalam format “string angka”. Angka tersebut akan menjadi kuncinya, dan string akan menjadi nilainya. Kami juga menunjukkan jenis kunci apa yang akan kami miliki ( Integer) dan jenis nilai apa ( String). Mengapa demikian? Pertama, kunci dalam HashMap selalu unik . Ini akan bermanfaat bagi kami karena kami dapat menggunakan nomor paspor sebagai kunci dan menghindari duplikat. Dan baris dengan nama lengkap akan bertindak sebagai nilai (nama lengkap orang yang berbeda dapat dengan mudah diulang, tidak ada salahnya bagi kami).

Menambahkan pasangan baru ke HashMap

Tugas ini terlihat seperti ini:
public class Main {

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


       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");
       System.out.println(passportsAndNames);

   }

}
Metode ini digunakan untuk ini put(). Selain itu, HashMap memiliki metode yang diganti toString()sehingga dapat dicetak ke konsol. Outputnya akan terlihat seperti ini: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov}

Fitur Kunci HashMap

Sekarang mari kita periksa apakah kuncinya benar-benar unik? Mari kita coba menambahkan elemen baru dengan kunci yang sudah ada di peta:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");
   passportsAndNames.put(162348, "Viktor Mikhailovich Stychkin");//repeat key

   System.out.println(passportsAndNames);

}
Output: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Viktor Mikhailovich Stychkin} Elemen sebelumnya dengan kunci 162348, seperti yang Anda lihat, telah ditimpa. “Kuncinya” disebut kunci karena suatu alasan. Nilai dalam HashMap diakses dengan kunci (tetapi tidak sebaliknya - kunci tidak dapat diperoleh berdasarkan nilai, karena nilai dapat diduplikasi). Hal ini terlihat jelas pada contoh mendapatkan elemen, serta menghapus elemen dari HashMap:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   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 kunci unik yang sesuai dengan nilai ini ke get()metode . Tidak ada indeks numerik, seperti dalam array atau daftar, di HashMap - nilainya diakses dengan kunci. Keluaran konsol: Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump}remove()

Memeriksa keberadaan kunci dan nilai

Di kelas ArrayList dan LinkedList , kita dapat memeriksa apakah suatu daftar berisi elemen tertentu. HashMap juga memungkinkan Anda melakukan ini, dan untuk kedua bagian pasangan: ia memiliki metode containsKey()(memeriksa keberadaan kunci) dan containsValue()(memeriksa keberadaan nilai).
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");


   System.out.println(passportsAndNames.containsKey(11111));
   System.out.println(passportsAndNames.containsValue("Donald John Trump"));

}
Keluaran: salah benar

Mendapatkan daftar semua kunci dan nilai

Fitur praktis lainnya dari HashMap adalah Anda bisa mendapatkan daftar semua kunci dan semua nilai secara terpisah . Untuk ini, metode keySet()dan digunakan values():
public class Main {

   public static void main(String[] args) {

       HashMap<Integer, String> passportsAndNames = new HashMap<>();

       passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
       passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
       passportsAndNames.put(8082771, "Donald John Trump");

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

       ArrayList<String> values = new ArrayList<>(passportsAndNames.values());
       System.out.println("Values: " + values);

   }

}
Kuncinya diekstraksi ke dalam koleksi Set. Keunikannya adalah tidak dapat mengandung unsur berulang. Sekarang hal utama yang perlu diingat adalah bahwa daftar semua kunci dapat dikeluarkan dari HashMap ke dalam koleksi terpisah. Dalam contoh, kami menyimpan nilainya ke normal ArrayList. Keluaran konsol: Kunci: [212133, 8082771, 162348] Nilai: [Lidiya Arkadyevna Bublikova, Donald John Trump, Ivan Mikhailovich Serebryakov] Metode size()melakukan clear()hal yang persis sama seperti pada struktur sebelumnya yang kita lalui: yang pertama mengembalikan sejumlah elemen dalam kamus saat ini, yang kedua menghapus semua elemen.
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   System.out.println(passportsAndNames.size());
   passportsAndNames.clear();
   System.out.println(passportsAndNames);

}
Output: 3 {} Untuk memeriksa apakah HashMap kita memiliki setidaknya satu elemen, kita bisa menggunakan metode isEmpty():
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   if (!passportsAndNames.isEmpty()) {

       System.out.println(passportsAndNames);

   }

}
Output: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov} Sekarang kami akan menampilkan output ke konsol hanya setelah verifikasi awal :)

Menggabungkan dua peta menjadi satu

Hal menarik lainnya adalah dua peta dapat digabungkan menjadi satu . Ada metode untuk ini putAll(). Kita menyebutnya pada HashMap pertama , meneruskan argumen kedua sebagai argumen, dan elemen dari argumen kedua akan ditambahkan ke argumen pertama:
public static void main(String[] args) {

   HashMap<Integer, String> passportsAndNames = new HashMap<>();
   HashMap<Integer, String> passportsAndNames2 = new HashMap<>();

   passportsAndNames.put(212133, "Lydia Arkadievna Bublikova");
   passportsAndNames.put(162348, "Ivan Mikhailovich Serebryakov");
   passportsAndNames.put(8082771, "Donald John Trump");

   passportsAndNames2.put(917352, "Alexey Andreevich Ermakov");
   passportsAndNames2.put(925648, "Maxim Olegovich Arkharov");


   passportsAndNames.putAll(passportsAndNames2);
   System.out.println(passportsAndNames);

}
Keluaran: {917352=Alexey Andreevich Ermakov, 212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 925648=Maxim Olegovich Arkharov, 162348=Ivan Mikhailovich Serebryakov} Semua elemen pasportAndNames2 disalin ke pasporDanNama . Sekarang mari kita lihat contoh yang lebih rumit. Yaitu, ulangi HashMap dalam satu lingkaran.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
Antarmuka Map.Entryberarti pasangan nilai kunci di dalam kamus. Metode ini entrySet()mengembalikan daftar semua pasangan di HashMap kami (karena peta kami hanya terdiri dari pasangan Entri tersebut, kami mengulangi pasangan, dan bukan kunci atau nilai secara terpisah). Kesimpulan: 212133=Lidiya Arkadyevna Bublikova 8082771=Donald John Trump 162348=Ivan Mikhailovich Serebryakov Simpan artikel ini untuk masa depan: https://habr.com/ru/post/128017/ Sekarang masih terlalu dini untuk membacanya, tetapi di masa depan , ketika Anda mulai menggunakan HashMap, ini akan membantu Anda memahami cara kerja struktur data ini dari dalam. Juga, jangan lupa untuk memeriksa dokumentasi resmi Oracle di HashMap.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION