JavaRush /Java Blog /Random-ID /9 Pertanyaan Teratas Tentang Peta di Java
Treefeed
Level 21

9 Pertanyaan Teratas Tentang Peta di Java

Dipublikasikan di grup Random-ID
Ingatlah bahwa Peta adalah data terstruktur yang terdiri dari sekumpulan pasangan nilai kunci, dan setiap kunci hanya dapat digunakan satu kali dalam satu Peta. Topik ini mencakup 9 pertanyaan dasar tentang penggunaan Peta di Java dan kelas yang diimplementasikan. Untuk mempermudah, saya akan menggunakan generalisasi dalam contoh . Oleh karena itu, saya hanya akan menulis Peta, tanpa menentukan penentu Peta. Namun Anda dapat berasumsi bahwa nilai K dan V keduanya sebanding, yang berarti K memperluas Comparable dan V juga memperluas Comparable .9 Pertanyaan Teratas Tentang Peta di Java - 1

0. Mengubah Peta menjadi Daftar

Di Java, antarmuka Peta menawarkan tiga jenis koleksi: kumpulan kunci, kumpulan nilai, dan kumpulan nilai kunci. Semuanya dapat diubah menjadi Daftar menggunakan konstruktor atau metode addAll(). Cuplikan kode berikut menunjukkan cara membuat ArrayList dari 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. Ulangi semua nilai di Peta

Menelusuri setiap pasangan nilai kunci adalah prosedur paling mendasar dan mendasar untuk menelusuri Peta. Di Java, setiap pasangan disimpan dalam bidang Map yang disebut Map.Entry . Map.entrySet()mengembalikan sekumpulan nilai kunci, jadi cara paling efisien untuk mengulangi semua nilai Peta adalah:
for(Entry entry: Map.entrySet()) {
  //get the key
  K key = entry.getKey();
  //get value
  V value = entry.getValue();
}
Kita juga bisa menggunakan Iterator, terutama pada versi yang lebih muda dari 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 berdasarkan Kunci

Mengatur Peta berdasarkan tombol adalah prosedur lain yang umum digunakan. Cara pertama adalah menambahkan Map.Entry ke dalam daftar, dan mengurutkannya menggunakan pembanding yang mengurutkan berdasarkan 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 juga mengatur kuncinya secara berurutan. Namun, semua kunci harus mewujudkan Comparable atau diterima oleh pembanding. Salah satu kelas yang diimplementasikan SortedMapadalah TreeMap . Konstruktornya menerima pembanding. Kode berikut menunjukkan cara mengubah kode normal Mapmenjadi kode terurut.
SortedMap sortedMap = new TreeMap(new Comparator() {

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

});
sortedMap.putAll(Map);

3. Memesan Peta berdasarkan Nilai

Menambahkan Peta ke daftar dan kemudian mengurutkannya berfungsi dalam kasus ini, tetapi kali ini Anda perlu menggunakan Entry.getValue(). Kode dibawah ini hampir sama dengan sebelumnya.
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());
  }

});
Kita masih bisa menggunakannya SortedMapdalam kasus ini, tapi hanya jika nilainya unik. Dalam hal ini, Anda dapat mengubah pasangan nilai kunci menjadi nilai kunci. Solusi ini memiliki keterbatasan yang parah dan tidak saya rekomendasikan.

4. Menginisialisasi Peta statis/tidak dapat diubah

Jika Anda ingin agar Peta tetap tidak dapat diubah, cara yang baik adalah dengan menyalinnya ke dalam Peta yang tidak dapat diubah. Teknik pemrograman defensif ini akan membantu Anda membuat Peta yang tidak hanya aman untuk digunakan, tetapi juga aman untuk thread. Untuk menginisialisasi Peta statis/tidak dapat diubah, kita dapat menggunakan penginisialisasi static(lihat di bawah). Masalah dengan kode ini adalah meskipun Map dideklarasikan sebagai static final, kita masih dapat mengerjakannya setelah inisialisasi, misalnya Test.Map.put(3,"three");. Jadi ini bukanlah kekekalan yang nyata. Untuk membuat Peta yang tidak dapat diubah menggunakan penginisialisasi statis, kita memerlukan kelas super anonim, yang akan kita tambahkan ke Peta yang tidak dapat diubah pada langkah inisialisasi terakhir. Silakan lihat bagian kedua dari kode tersebut. Ketika UnsupportedOperationException akan dilempar 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 mendukung berbagai cara untuk menginisialisasi koleksi statis dan tidak dapat diubah. Untuk mempelajari lebih lanjut tentang manfaat utilitas koleksi jambu biji yang tidak dapat diubah, lihat bagian Koleksi yang tidak dapat diubah di Panduan Cara Jambu Biji .

5. Perbedaan HashMap, TreeMap, dan Hashtable

Ada tiga implementasi utama antarmuka Map di Java: HashMap , TreeMap , dan Hashtable . Perbedaan utamanya adalah sebagai berikut:
  • Urutan perjalanan . HashMap dan HashTable tidak menjamin pengurutan Peta; khususnya, mereka tidak menjamin bahwa pesanan akan tetap sama seiring berjalannya waktu. Tapi TreeMapitu akan mengurutkan semua nilai dalam "urutan alami" kunci atau dengan pembanding.
  • Pasangan nilai kunci yang valid. HashMapmemungkinkan Anda memiliki kunci nol dan nilai nol. HashTabletidak mengizinkan kunci nol atau nilai nol. Jika TreeMaptatanan natural digunakan atau pembanding tidak mengizinkan kunci nol, pengecualian akan dilempar.
  • Sinkronisasi . Hanya HashTabletersinkronisasi, selebihnya tidak. Namun, "jika implementasi thread-safe tidak diperlukan, disarankan untuk menggunakan " HashMapsebagai gantinya HashTable.
Perbandingan lebih detail
.                       | HashMap | HashTable | TreeMap
-------------------------------------------------------

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

6. Peta dengan pencarian/tampilan terbalik

Terkadang, kita memerlukan sekumpulan pasangan kunci-kunci, yang berarti nilainya sama uniknya dengan kuncinya (pola satu-ke-satu). Konsistensi ini memungkinkan Anda membuat "tampilan/pencarian terbalik" pada Peta. Artinya, kita dapat menemukan kunci berdasarkan nilainya. Struktur data ini disebut peta dua arah , yang sayangnya tidak didukung oleh JDK. Apache Common Collections dan Guava masing-masing menawarkan implementasi Peta dua arah yang disebut BidiMap dan BiMap. Keduanya memperkenalkan batasan yang menerapkan pemetaan 1:1 antara kunci dan nilai.

7. Salinan Peta yang dangkal

Hampir semua, jika tidak semua, Maps di Java berisi copy konstruktor untuk Map lain. Namun prosedur penyalinannya tidak sinkron. Artinya ketika satu thread menyalin Peta, thread lain dapat mengubah strukturnya. Untuk mencegah desinkronisasi salinan secara tiba-tiba, salah satunya harus digunakan dalam kasus seperti itu Collections.synchronizedMap().
Map copiedMap = Collections.synchronizedMap(Map);
Cara lain yang menarik untuk menyalin secara dangkal adalah dengan menggunakan clone(). Tapi ini TIDAK direkomendasikan bahkan oleh pencipta kerangka koleksi Java, Joshua Bloch. Dalam perdebatan " Copy Constructor vs. Cloning ", dia mengambil posisi: Kutipan: "Saya sering memberikan metode klon publik di kelas konkret karena orang mengharapkannya ada di sana. ... sayang sekali Kloning rusak, tapi itu terjadi.... Kloning adalah titik lemahnya, dan saya pikir orang-orang harus diperingatkan tentang keterbatasannya." Karena alasan ini, saya bahkan tidak menunjukkan cara menggunakan metode clone()menyalin Peta

8. Buat Peta kosong

Jika Maptidak dapat diubah, gunakan:
Map = Collections.emptyMap();
Atau, gunakan perwujudan lainnya. Misalnya:
Map = new HashMap();
AKHIR
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION