CodeGym /Blog Java /rawak /HashMap: apakah jenis peta ini?
John Squirrels
Tahap
San Francisco

HashMap: apakah jenis peta ini?

Diterbitkan dalam kumpulan
Hai! Dalam pelajaran ini, kami akan mengambil ulasan lebih dekat di Java HashMap . Sebelum ini, kami telah mengkaji struktur data di mana unsur-unsur disimpan sebagai diri mereka sendiri. Dalam tatasusunan atau ArrayList / LinkedList , kami menyimpan beberapa bilangan elemen. Tetapi bagaimana jika tugas kita berubah sedikit?
HashMap: apakah jenis peta ini?  - 1
Bayangkan tugas berikut: buat senarai 100 orang yang menyimpan nama dan nombor pasport setiap orang. Pada dasarnya, ini tidak begitu sukar. Sebagai contoh, anda boleh memasukkan kedua-duanya ke dalam rentetan, dan kemudian mencipta senarai rentetan ini: "Amelia Aguilar, 4211 717171". Tetapi penyelesaian ini mempunyai dua kelemahan. Pertama, kita mungkin memerlukan keupayaan untuk mencari mengikut nombor pasport. Dan ini akan menjadi masalah memandangkan format penyimpanan maklumat ini. Kedua, tiada apa yang menghalang kita daripada mencipta dua orang berbeza dengan nombor pasport yang sama. Dan ini adalah kelemahan penyelesaian kami yang paling serius. Ini tidak sepatutnya dibenarkan: tiada dua orang mempunyai nombor pasport yang sama. Struktur data baharu datang untuk membantu kami: Peta. Ia juga dikenali sebagai "tatasusunan bersekutu", tetapi istilah ini jarang digunakan. Lebih biasa, ia dipanggil "kamus" atau "peta". :) Bagaimanakah ia pada asasnya berbeza daripada struktur data yang telah kami pertimbangkan sebelum ini? Di atas semua itu, pada hakikatnya data dalam Peta disimpan sebagai pasangan nilai kunci. Apa-apa sahaja boleh berfungsi sebagai kunci dan nilai: nombor, rentetan atau objek kelas lain. Hari ini kita akan mengkaji pelaksanaan kelas Peta yang paling biasa : Java HashMap . HashMap: apakah jenis peta ini?  - 2

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

Ia sangat mudah untuk dibuat:

public static void main(String[] args) {
   HashMap<Integer, String> passportsAndNames = new HashMap<>();
}
Di sini kami mencipta kamus yang menyimpan elemen sebagai pasangan "nombor-rentetan". Nombor akan bertindak sebagai kunci, dan rentetan sebagai nilai. Juga kami menentukan jenis kunci (Integer) dan jenis nilai (String). kenapa? Pertama, kunci HashMap sentiasa unik. Ini sangat sesuai dengan kami, kerana kami boleh menggunakan nombor pasport sebagai kunci dan mengelakkan pendua. Nilai akan menjadi rentetan dengan nama penuh (orang yang berbeza boleh mempunyai nama yang sama; itu tidak perlu kita risaukan). Menambah pasangan baharu pada HashMap kelihatan 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 kaedah put() untuk ini. Selain itu, HashMap mengatasi kaedah toString() , supaya ia boleh dipaparkan pada konsol. Outputnya akan kelihatan seperti ini: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} Sekarang mari kita sahkan sama ada kunci itu benar-benar unik? Mari cuba tambah elemen baharu dengan kunci yang telah digunakan dalam 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);
}
Output: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Albert Kent} Seperti yang anda lihat, nilai sebelumnya yang dikaitkan dengan kunci 162348 telah ditimpa. Kami menggunakan istilah "kunci" atas sebab tertentu. Nilai dalam HashMap diakses menggunakan kekunci, tetapi bukan sebaliknya. Kunci tidak boleh diperoleh menggunakan nilai, kerana nilainya mungkin tidak unik. Ini boleh dilihat dengan jelas apabila mendapatkan atau mengalih keluar elemen daripada 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 mengalih keluar pasangan daripada kamus, kita mesti menghantar ke get() dan remove() kunci unik yang sepadan dengan nilai. Tidak seperti tatasusunan dan senarai, HashMap dalam Java tidak mempunyai indeks berangka: nilai diakses menggunakan kekunci. Output konsol: Bridget Logan {212133=Bridget Logan, 8082771=Donald John Trump} Kelas ArrayList dan LinkedList membolehkan kami menyemak sama ada senarai itu mengandungi sebarang elemen tertentu. Java HashMap membolehkan kami melakukan ini. Lebih-lebih lagi, kita boleh melakukan ini untuk kedua-dua ahli pasangan: Inilah yang containsKey() (semak untuk kunci) dan containsValue()(menyemak nilai) kaedah 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 Satu lagi ciri mudah HashMap di Jawa ialah hakikat bahawa anda boleh mendapatkan senarai berasingan semua kunci dan semua nilai. Ini dicapai dengan kaedah 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);
   }
}
Kekunci diekstrak ke dalam Set , yang belum kami bincangkan lagi. Ia istimewa kerana ia tidak boleh mengandungi elemen berulang. Sekarang perkara utama ialah ingat bahawa senarai semua kunci boleh diambil dari HashMap ke dalam koleksi yang berasingan. Dalam contoh, kami menyimpan nilai ke dalam ArrayList biasa . Output konsol: Kekunci: [212133, 8082771, 162348] Nilai: [Bridget Logan, Donald John Trump, Ivan the Great] Kaedah size() dan clear() melakukan perkara yang sama seperti dalam struktur sebelumnya yang telah kita bincangkan: yang pertama mengembalikan bilangan elemen yang ada dalam kamus, yang kedua mengalih keluar 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);
}
Output: 3 {} Untuk menyemak sama ada terdapat sekurang-kurangnya satu elemen dalam HashMap kami , kami boleh menggunakan kaedah 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);
   }
}
Output: {212133=Bridget Logan, 8082771=Donald John Trump, 162348=Ivan the Great} Sekarang kita hanya akan keluarkan ke konsol selepas semakan awal. :) Satu lagi perkara yang menarik ialah dua Peta boleh digabungkan menjadi satu. Ini dicapai menggunakan kaedah putAll() . Kami memanggilnya pada HashMap pertama , lulus yang kedua sebagai hujah, dan elemen dari yang kedua 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, "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);
}
Output: {917352=Clifford Patrick, 212133=Bridget Logan, 8082771=Donald John Trump, 925648=Mitchell Salgado, 162348=Ivan the Great} Semua pasangan dalam pasportAndNames2 telah disalin ke passportsAndNames . Sekarang pertimbangkan contoh yang lebih rumit. Khususnya, mengulangi HashMap dalam gelung.

for (Map.Entry<Integer, String> entry: passportsAndNames.entrySet()) {
   System.out.println(entry);
}
Kelas Map.Entry menandakan pasangan nilai kunci dalam kamus. Kaedah entrySet () mengembalikan senarai semua pasangan dalam HashMap kami . Oleh kerana peta kami terdiri daripada pasangan Map.Entry ini , kami mengulangi pasangan, bukan kunci atau nilai yang berasingan. Output: 212133=Bridget Logan 8082771=Donald John Trump 162348=Ivan the Great Juga, jangan lupa untuk mengkaji dokumentasi Oracle rasmi untuk HashMap .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION