JavaRush /Blog Java /Random-MS /9 Soalan Teratas Mengenai Peta di Jawa
Treefeed
Tahap

9 Soalan Teratas Mengenai Peta di Jawa

Diterbitkan dalam kumpulan
Ingat bahawa Peta ialah data berstruktur yang terdiri daripada set pasangan nilai kunci dan setiap kunci hanya boleh digunakan sekali dalam satu Peta. Topik ini merangkumi 9 soalan asas tentang menggunakan Peta dalam Java dan kelas yang dilaksanakannya. Untuk kesederhanaan, saya akan menggunakan generalisasi dalam contoh . Oleh itu, saya hanya akan menulis Peta, tanpa menyatakan penentu Peta. Tetapi anda boleh mengandaikan bahawa kedua-dua nilai K dan V adalah setanding, yang bermaksud K memanjang Sebanding dan V juga memanjang Sebanding .9 Soalan Teratas Mengenai Peta di Jawa - 1

0. Menukar Peta kepada Senarai

Di Java, antara muka Peta menawarkan tiga jenis koleksi: set kunci, set nilai dan set nilai kunci. Kesemuanya boleh ditukar menjadi Senarai menggunakan pembina atau kaedah addAll(). Coretan kod berikut menunjukkan cara membuat ArrayList daripada Peta.
// list of keys
List keyList = new ArrayList(Map.keySet());
//list of values
List valueList = new ArrayList(Map.valueSet());
//list key-value
List entryList = new ArrayList(Map.entrySet());

1. Gelung semua nilai dalam Peta

Berjalan melalui setiap pasangan nilai kunci ialah prosedur asas yang paling asas untuk berjalan melalui Peta. Di Jawa, setiap pasangan disimpan dalam medan Peta yang dipanggil Map.Entry . Map.entrySet()mengembalikan satu set nilai-kunci, jadi cara yang paling berkesan untuk mengulangi semua nilai Peta ialah:
for(Entry entry: Map.entrySet()) {
  //get the key
  K key = entry.getKey();
  //get value
  V value = entry.getValue();
}
Kami juga boleh menggunakan Iterator, terutamanya dalam versi yang lebih muda daripada JDK 1.5
Iterator itr = Map.entrySet().iterator();
while(itr.hasNext()) {
  Entry entry = itr.next();
  //get the key
  K key = entry.getKey();
  //get value
  V value = entry.getValue();
}

2. Memesan Peta dengan Kekunci

Menyusun Peta mengikut kekunci adalah satu lagi prosedur yang biasa digunakan. Cara pertama ialah menambah Map.Entry pada senarai dan mengisih menggunakan pembanding yang mengisih mengikut nilai.
List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {

  @Override
  public int compare(Entry e1, Entry e2) {
    return e1.getKey().compareTo(e2.getKey());
  }
});
Cara lain: gunakan SortedMap , yang, sebagai tambahan, turut menyusun kuncinya mengikut urutan. Tetapi, semua kunci mesti merangkumi Comparable atau diterima oleh pembanding. Salah satu kelas yang dilaksanakan SortedMapialah TreeMap . Pembinanya menerima pembanding. Kod berikut menunjukkan cara menukar yang biasa Mapkepada yang tertib.
SortedMap sortedMap = new TreeMap(new Comparator() {

  @Override
  public int compare(K k1, K k2) {
    return k1.compareTo(k2);
  }

});
sortedMap.putAll(Map);

3. Peta Susunan mengikut Nilai

Menambah Peta pada senarai dan kemudian menyusunnya berfungsi dalam kes ini, tetapi kali ini anda perlu menggunakan Entry.getValue(). Kod di bawah hampir sama seperti sebelum ini.
List list = new ArrayList(Map.entrySet());
Collections.sort(list, new Comparator() {

  @Override
  public int compare(Entry e1, Entry e2) {
    return e1.getValue().compareTo(e2.getValue());
  }

});
Kami masih boleh menggunakannya SortedMapdalam kes ini, tetapi hanya jika nilainya unik. Dalam kes ini, anda boleh menukar pasangan nilai kunci menjadi nilai kunci. Penyelesaian ini mempunyai had yang teruk dan tidak disyorkan oleh saya.

4. Memulakan Peta statik/tidak berubah

Apabila anda mahu Peta kekal tidak berubah, cara yang baik ialah menyalinnya ke Peta tidak berubah. Teknik pengaturcaraan pertahanan ini akan membantu anda membuat Peta yang bukan sahaja selamat untuk digunakan, tetapi juga selamat untuk benang. Untuk memulakan Peta statik/tidak berubah, kita boleh menggunakan pemula static(lihat di bawah). Masalah dengan kod ini ialah walaupun mengisytiharkan Peta sebagai static final, kita masih boleh bekerja dengannya selepas permulaan, contohnya Test.Map.put(3,"three");. Jadi ia bukan kebolehubahan sebenar. Untuk mencipta Peta tidak berubah menggunakan pemula statik, kami memerlukan kelas super tanpa nama, yang akan kami tambahkan pada Peta tidak berubah pada langkah permulaan terakhir. Sila lihat bahagian kedua kod. Apabila UnsupportedOperationException akan dilemparkan jika anda menjalankan Test.Map.put(3,"three");.
public class Test {

  private static final Map Map;
  static {
    Map = new HashMap();
    Map.put(1, "one");
    Map.put(2, "two");
  }
}
public class Test {

  private static final Map Map;
  static {
    Map aMap = new HashMap();
    aMap.put(1, "one");
    aMap.put(2, "two");
    Map = Collections.unmodifiableMap(aMap);
  }
}
Pustaka Guava juga menyokong pelbagai cara untuk memulakan koleksi statik dan tidak berubah. Untuk mengetahui lebih lanjut tentang faedah utiliti koleksi tidak berubah Guava, lihat bahagian Koleksi Tidak berubah dalam Cara Cara Guava .

5. Perbezaan antara HashMap, TreeMap dan Hashtable

Terdapat tiga pelaksanaan utama antara muka Peta dalam Java: HashMap , TreeMap , dan Hashtable . Perbezaan utama adalah seperti berikut:
  • Urutan laluan . HashMap dan HashTable tidak menjamin pesanan Peta; khususnya, mereka tidak menjamin bahawa pesanan akan kekal sama dari semasa ke semasa. Tetapi TreeMapia akan memerintahkan semua nilai dalam "tertib semula jadi" kekunci atau oleh pembanding.
  • Pasangan nilai kunci yang sah. HashMapmembolehkan anda mempunyai kunci null dan nilai null. HashTabletidak membenarkan kunci null atau nilai null. Jika TreeMapsusunan semula jadi digunakan atau pembanding tidak membenarkan kunci nol, pengecualian akan dibuang.
  • Penyegerakan . Hanya HashTabledisegerakkan, selebihnya tidak. Tetapi, "jika pelaksanaan selamat benang tidak diperlukan, adalah disyorkan untuk menggunakan " HashMapsebaliknya HashTable.
Perbandingan yang lebih terperinci
.                       | HashMap | HashTable | TreeMap
-------------------------------------------------------

Упорядочивание          |нет      |нет        | да
null в ключ-meaning    | да-да   | нет-нет   | нет-да
синхронизировано        | нет     | да        | нет
производительность      | O(1)    | O(1)      | O(log n)
воплощение              | корзины | корзины   | красно-чёрное дерево
Baca lebih lanjut tentang hubungan HashMap lwn . TreeMap lwn. Hashtable lwn. LinkedHashMap .

6. Peta dengan carian/pandangan terbalik

Kadangkala, kita memerlukan satu set pasangan kunci-kunci, yang bermaksud nilai-nilai adalah unik seperti kekunci (corak satu-satu). Konsistensi ini membolehkan anda membuat "pandangan/carian terbalik" pada Peta. Iaitu, kita boleh mencari kunci dengan nilainya. Struktur data ini dipanggil Peta dwiarah , yang malangnya tidak disokong oleh JDK. Kedua-dua Apache Common Collections dan Guava menawarkan pelaksanaan Peta dwiarah yang dipanggil BidiMap dan BiMap, masing-masing. Kedua-duanya memperkenalkan kekangan yang menguatkuasakan pemetaan 1:1 antara kunci dan nilai.

7. Salinan cetek Peta

Hampir semua, jika tidak semua, Peta dalam Java mengandungi pembina salinan untuk Peta lain. Tetapi prosedur penyalinan tidak disegerakkan. Maksudnya apabila satu utas menyalin Peta, utas lain boleh mengubah strukturnya. Untuk mengelakkan penyahsegerakan salinan secara tiba-tiba, salah satu daripadanya hendaklah digunakan dalam kes sedemikian Collections.synchronizedMap().
Map copiedMap = Collections.synchronizedMap(Map);
Satu lagi cara menarik untuk menyalin secara cetek ialah menggunakan clone(). Tetapi ia TIDAK disyorkan walaupun oleh pencipta rangka kerja koleksi Java, Joshua Bloch. Dalam perbahasan " Copy Constructor vs. Cloning ", dia mengambil pendirian: Petikan: "Saya sering memasukkan kaedah klon awam dalam kelas konkrit kerana orang ramai mengharapkan mereka berada di sana. ... memalukan bahawa Pengklonan rosak, tetapi ia berlaku. ... Pengklonan adalah titik lemah, dan saya fikir orang ramai harus diberi amaran tentang batasannya." Atas sebab ini, saya tidak menunjukkan kepada anda cara menggunakan kaedah clone()untuk menyalin Peta

8. Buat Peta kosong

Jika Maptidak berubah, gunakan:
Map = Collections.emptyMap();
Atau, gunakan sebarang penjelmaan lain. Sebagai contoh:
Map = new HashMap();
TAMAT
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION