JavaRush /Blog Java /Random-MS /HashMap dalam Java - apakah jenis peta itu?

HashMap dalam Java - apakah jenis peta itu?

Diterbitkan dalam kumpulan
hello! Hari ini kita akan bercakap tentang satu lagi struktur data - Peta. Nama rasmi Rusianya ialah "tatasusunan bersekutu," tetapi ia tidak selalu digunakan. Pilihan yang lebih biasa ialah "kamus", "peta", atau (paling kerap) slanga anglicism "peta" :) Di dalam Peta, data disimpan dalam format "kunci" - "nilai", iaitu, secara berpasangan. Kedua-dua kunci dan nilai boleh berupa sebarang objek—nombor, rentetan atau objek kelas lain.

Bagaimana Peta berbeza daripada struktur data lain

Sebelum ini, kami melihat struktur data di mana elemen disimpan sendiri. Dalam tatasusunan, atau ArrayList / LinkedList , kami menyimpan beberapa elemen tertentu. Tetapi bagaimana jika tugas kita berubah sedikit? Sebagai contoh, bayangkan bahawa kita berhadapan dengan tugas membuat senarai 100 orang, di mana nama penuh dan nombor pasport orang itu akan disimpan. Pada dasarnya, ia tidak begitu sukar. Sebagai contoh, anda boleh memuatkan kedua-duanya dalam satu baris dan membuat senarai baris seperti ini: "Anna Ivanovna Reshetnikova, 4211 717171." Tetapi penyelesaian ini mempunyai dua kelemahan. Pertama, kita mungkin memerlukan fungsi carian pasport. Dan dengan format ini untuk menyimpan maklumat, ini akan menjadi masalah. Dan kedua, tiada apa yang akan menghalang kita daripada mencipta dua orang berbeza dengan nombor pasport yang sama. Dan ini adalah kelemahan paling serius penyelesaian kami. Situasi sedemikian harus dikecualikan sepenuhnya; tidak ada dua orang dengan nombor pasport yang sama. Di sini Peta dan ciri yang diisytiharkan membantu kami (menyimpan data dalam pasangan dalam format "kunci"-"nilai"). Mari lihat pelaksanaan Peta yang paling biasa - kelas Java HashMap .HashMap - apakah jenis peta ini?  - 1

Mencipta HashMap dalam Java dan bekerja dengan kelas

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

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

}
Di sini kami telah mencipta kamus di mana elemen akan disimpan dalam format "rentetan nombor". Nombor akan menjadi kunci, dan rentetan akan menjadi nilai. Kami juga menunjukkan jenis kunci yang akan kami miliki ( Integer) dan jenis nilai yang akan kami miliki ( String). Kenapa jadi begini? Pertama, kunci dalam HashMap sentiasa unik . Ini akan berkesan untuk kami kerana kami boleh menggunakan nombor pasport sebagai kunci dan mengelakkan pendua. Dan baris dengan nama penuh akan bertindak sebagai nilai (nama penuh orang yang berbeza boleh diulang dengan mudah, tidak ada yang salah untuk kita).

Menambah pasangan baharu pada HashMap

Tugasan ini kelihatan 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);

   }

}
Kaedah digunakan untuk ini put(). Selain itu, HashMap mempunyai kaedah yang diganti toString()supaya ia boleh dicetak ke konsol. Outputnya akan kelihatan seperti ini: {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 162348=Ivan Mikhailovich Serebryakov}

Ciri-ciri Kunci HashMap

Sekarang mari kita semak sama ada kunci itu benar-benar unik? Mari cuba tambah elemen baharu dengan kunci yang sudah ada dalam 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. "Kunci" dipanggil kunci atas sebab tertentu. Nilai dalam HashMap diakses dengan kunci (tetapi bukan sebaliknya - kunci tidak boleh diperoleh dengan nilai, kerana nilai boleh diduplikasi). Ini jelas dilihat dalam contoh mendapatkan elemen, serta mengalih keluar elemen daripada 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 mengalih keluar pasangan daripada kamus, kita mesti menghantar tepat kekunci unik yang sepadan dengan nilai ini kepada get()kaedah . Tiada indeks berangka, seperti dalam tatasusunan atau senarai, dalam HashMap - nilai diakses oleh kunci. Output konsol: Lidiya Arkadyevna Bublikova {212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump}remove()

Menyemak kehadiran kunci dan nilai

Dalam kelas ArrayList dan LinkedList , kita boleh menyemak sama ada senarai mengandungi elemen tertentu. HashMap juga membolehkan anda melakukan ini, dan untuk kedua-dua bahagian pasangan: ia mempunyai kaedah containsKey()(menyemak kehadiran kunci) dan containsValue()(menyemak kehadiran 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"));

}
Output: palsu benar

Mendapatkan senarai semua kunci dan nilai

Satu lagi ciri mudah HashMap ialah anda boleh mendapatkan senarai semua kunci dan semua nilai secara berasingan . Untuk ini, kaedah 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);

   }

}
Kunci diekstrak ke dalam koleksi Set. Keistimewaannya ialah ia tidak boleh mengandungi unsur berulang. Sekarang perkara utama yang perlu diingat ialah senarai semua kunci boleh dikeluarkan daripada HashMap ke dalam koleksi yang berasingan. Dalam contoh, kami menyimpan nilai kepada normal ArrayList. Output konsol: Kekunci: [212133, 8082771, 162348] Nilai: [Lidiya Arkadyevna Bublikova, Donald John Trump, Ivan Mikhailovich Serebryakov] Kaedah size()melakukan clear()perkara yang sama seperti dalam struktur sebelumnya yang kami lalui: yang pertama mengembalikan elemen nombor dalam kamus pada saat semasa, yang kedua memadamkan 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 menyemak sama ada HashMap kami mempunyai sekurang-kurangnya satu elemen, kami boleh menggunakan kaedah 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 keluarkan ke konsol hanya selepas pengesahan awal :)

Menggabungkan dua peta menjadi satu

Satu lagi perkara yang menarik ialah dua peta boleh digabungkan menjadi satu . Terdapat kaedah untuk ini putAll(). Kami memanggilnya pada HashMap pertama , lulus yang kedua sebagai hujah, dan elemen dari yang kedua akan ditambah kepada yang 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);

}
Output: {917352=Alexey Andreevich Ermakov, 212133=Lidiya Arkadyevna Bublikova, 8082771=Donald John Trump, 925648=Maxim Olegovich Arkharov , 162348=Ivan Mikhailovich Serebryandriakov} Semua elemen pasport ke atas AndsAndikov } Semua elemen pasport Sekarang mari kita lihat contoh yang lebih rumit. Iaitu, ulangi HashMap dalam satu gelung.
for (Map.Entry entry: passportsAndNames.entrySet()) {

   System.out.println(entry);

}
Antara muka Map.Entryhanya bermaksud pasangan nilai kunci dalam kamus. Kaedah ini entrySet()mengembalikan senarai semua pasangan dalam HashMap kami (memandangkan peta kami hanya terdiri daripada pasangan Entri sedemikian, kami mengulangi pasangan, dan bukan kunci atau nilai secara berasingan). Kesimpulan: 212133=Lidiya Arkadyevna Bublikova 8082771=Donald John Trump 162348=Ivan Mikhailovich Serebryakov Simpan artikel ini untuk masa hadapan: https://habr.com/ru/post/128017/ Sekarang terlalu awal untuk membacanya, tetapi pada masa hadapan , apabila anda akan menggunakan HashMap, ia akan membantu anda memahami cara struktur data ini berfungsi dari dalam. Juga, jangan lupa untuk menyemak dokumentasi Oracle rasmi di HashMap.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION