Pertanyaan Perbedaan antara HashMap, LinkedHashMap dan TreeMap


Apa perbedaan antara HashMap, LinkedHashMap dan TreeMap di Jawa? Saya tidak melihat ada perbedaan dalam output karena ketiganya memiliki keySet dan values. Apa Hashtables?

Map m1 = new HashMap();
m1.put("map", "HashMap");
m1.put("schildt", "java2");
m1.put("mathew", "Hyden");
m1.put("schildt", "java2s");
print(m1.keySet()); 
print(m1.values()); 

SortedMap sm = new TreeMap();
sm.put("map", "TreeMap");
sm.put("schildt", "java2");
sm.put("mathew", "Hyden");
sm.put("schildt", "java2s");
print(sm.keySet()); 
print(sm.values());

LinkedHashMap lm = new LinkedHashMap();
lm.put("map", "LinkedHashMap");
lm.put("schildt", "java2");
lm.put("mathew", "Hyden");
lm.put("schildt", "java2s");
print(lm.keySet()); 
print(lm.values());

816
2018-05-22 21:10


asal


Jawaban:


Ketiga kelas menerapkan Map antarmuka dan menawarkan sebagian besar fungsi yang sama. Perbedaan paling penting adalah urutan di mana iterasi melalui entri akan terjadi:

  • HashMap sama sekali tidak menjamin tentang urutan iterasi. Ia bisa (dan akan) bahkan berubah sepenuhnya ketika elemen-elemen baru ditambahkan.
  • TreeMap akan iterasi sesuai dengan "pemesanan alami" kunci sesuai dengan mereka compareTo() metode (atau yang disediakan secara eksternal Comparator). Selain itu, ia mengimplementasikan SortedMap antarmuka, yang berisi metode yang bergantung pada urutan semacam ini.
  • LinkedHashMap akan mengulangi urutan urutan entri ke peta

"Hashtable" adalah nama generik untuk peta berbasis hash. Dalam konteks API Java, Hashtable adalah kelas yang tidak terpakai sejak jaman Java 1.1 sebelum kerangka koleksi ada. Itu tidak boleh digunakan lagi, karena API-nya berantakan dengan metode usang yang menggandakan fungsionalitas, dan metodenya disinkronkan (yang dapat menurunkan kinerja dan umumnya tidak berguna). Menggunakan ConcurrentHashMap bukannya Hashtable.


1019
2018-05-22 21:18



Saya lebih suka presentasi visual:

╔══════════════╦═════════════════════╦═══════════════════╦═════════════════════╗
║   Property   ║       HashMap       ║      TreeMap      ║     LinkedHashMap   ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ Iteration    ║  no guarantee order ║ sorted according  ║                     ║
║   Order      ║ will remain constant║ to the natural    ║    insertion-order  ║
║              ║      over time      ║    ordering       ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║  Get/put     ║                     ║                   ║                     ║
║   remove     ║         O(1)        ║      O(log(n))    ║         O(1)        ║
║ containsKey  ║                     ║                   ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║              ║                     ║   NavigableMap    ║                     ║
║  Interfaces  ║         Map         ║       Map         ║         Map         ║
║              ║                     ║    SortedMap      ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║              ║                     ║                   ║                     ║
║     Null     ║       allowed       ║    only values    ║       allowed       ║
║ values/keys  ║                     ║                   ║                     ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║              ║   Fail-fast behavior of an iterator cannot be guaranteed      ║
║   Fail-fast  ║ impossible to make any hard guarantees in the presence of     ║
║   behavior   ║           unsynchronized concurrent modification              ║
╠══════════════╬═════════════════════╦═══════════════════╦═════════════════════╣
║              ║                     ║                   ║                     ║
║Implementation║      buckets        ║   Red-Black Tree  ║    double-linked    ║
║              ║                     ║                   ║       buckets       ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║      Is      ║                                                               ║
║ synchronized ║              implementation is not synchronized               ║
╚══════════════╩═══════════════════════════════════════════════════════════════╝

1383
2017-07-17 19:24



Ketiganya merupakan pemetaan dari kunci unik ke nilai, dan oleh karena itu menerapkan Peta antarmuka.

  1. HashMap adalah peta berdasarkan hashing kunci. Ini mendukung O (1) operasi get / put. Kunci harus memiliki implementasi konsisten dari hashCode() dan equals() agar ini berfungsi.

  2. LinkedHashMap sangat mirip dengan HashMap, tetapi ia menambahkan kesadaran pada urutan di mana item ditambahkan (atau diakses), sehingga urutan iterasi sama dengan urutan penyisipan (atau urutan akses, tergantung pada parameter konstruksi).

  3. TreeMap adalah pemetaan berbasis pohon. Operasi put / get-nya mengambil waktu O (log n). Ini membutuhkan item untuk memiliki beberapa mekanisme perbandingan, baik dengan Comparable atau Comparator. Urutan iterasi ditentukan oleh mekanisme ini.


60
2018-05-22 21:17



Lihat di mana setiap kelas berada dalam hirarki kelas dalam diagram berikut (yang lebih besar). Alat TreeMap SortedMap dan NavigableMap sementara HashMap tidak.

HashTable sudah usang dan yang sesuai ConcurrentHashMap kelas harus digunakan. enter image description here


37
2018-01-30 02:28



Lebih banyak lagi masukan dari pengalaman saya sendiri dengan peta, kapan saya akan menggunakan masing-masing:

  • HashMap - Paling berguna ketika mencari implementasi terbaik (cepat).
  • TreeMap (SortedMap interface) - Paling berguna ketika saya peduli dengan kemampuan untuk mengurutkan atau mengulangi kunci dalam urutan tertentu yang saya definisikan.
  • LinkedHashMap - Menggabungkan keuntungan dari pemesanan terjamin dari TreeMap tanpa meningkatkan biaya pemeliharaan TreeMap. (Ini hampir secepat HashMap). Secara khusus, LinkedHashMap juga menyediakan titik awal yang bagus untuk membuat objek Cache dengan mengesampingkan removeEldestEntry()metode. Ini memungkinkan Anda membuat objek Cache yang dapat kadaluarsa data menggunakan beberapa kriteria yang Anda tetapkan.

35
2017-08-27 18:51



HashMap

  • Ini memiliki nilai pasangan (kunci, nilai)
  • TANPA nilai kunci duplikasi
  • tanpa nomor acak
  • ini memungkinkan satu kunci null dan lebih dari satu nilai null

HashTable

  • sama seperti peta hash
  • itu tidak memungkinkan kunci nol dan nilai nol

LinkedHashMap

  • Ini adalah versi terurut dari implementasi peta
  • Berdasarkan daftar terkait dan hashing struktur data

TreeMap

  • Versi yang dipesan dan disortir
  • berdasarkan struktur data hashing

34
2017-10-18 04:55



Ketiga kelas HashMap, TreeMap dan LinkedHashMap mengimplementasikan java.util.Map antarmuka, dan mewakili pemetaan dari kunci unik ke nilai.

HashMap

  1. SEBUAH HashMap mengandung nilai berdasarkan kunci.

  2. Ini hanya mengandung elemen unik.

  3. Ini mungkin memiliki satu kunci nol dan beberapa nilai null.

  4. Itu mempertahankan tidak ada pesanan.

    public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

LinkedHashMap

  1. SEBUAH LinkedHashMap mengandung nilai berdasarkan kunci.
  2. Ini hanya mengandung elemen unik.
  3. Ini mungkin memiliki satu kunci nol dan beberapa nilai null.
  4. Ini sama seperti HashMap mempertahankan urutan penyisipan. // Lihat deselerasi kelas di bawah

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

TreeMap

  1. SEBUAH TreeMap mengandung nilai berdasarkan kunci. Ini mengimplementasikan antarmuka NavigableMap dan memperluas kelas AbstractMap.
  2. Ini hanya mengandung elemen unik.
  3. Tidak dapat memiliki kunci null tetapi dapat memiliki beberapa nilai null.
  4. Sama seperti HashMap malah mempertahankan urutan menaik(Diurutkan menggunakan urutan alami kuncinya.).

    public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable 

Hashtable

  1. A Hashtable adalah array daftar. Setiap daftar dikenal sebagai ember. Posisi bucket diidentifikasi dengan memanggil metode hashcode (). Hashtable berisi nilai berdasarkan kunci.
  2. Ini hanya mengandung elemen unik.
  3. Itu mungkin tidak memiliki kunci atau nilai null.
  4. ini disinkronkan.
  5. Ini adalah kelas warisan.

    public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable

Ref: http://javarevisited.blogspot.in/2015/08/difference-between-HashMap-vs-TreeMap-vs-LinkedHashMap-Java.html


15
2018-05-05 05:28



HashMap benar-benar tidak menjamin tentang urutan iterasi. Saya t   dapat (dan akan) bahkan berubah sepenuhnya ketika elemen-elemen baru ditambahkan.   TreeMap akan beralih sesuai dengan "pemesanan alami" kunci   menurut metode compareTo () mereka (atau yang disediakan secara eksternal   Komparator). Selain itu, ia mengimplementasikan antarmuka SortedMap,   yang berisi metode yang bergantung pada urutan semacam ini. LinkedHashMap   akan mengulangi urutan urutan entri ke peta

Lihatlah bagaimana kinerja bervariasi .. enter image description here

Peta pohon yang merupakan implementasi dari peta yang diurutkan. Kompleksitas put, dapatkan dan berisi operasi Key adalah O (log n) karena pemesanan Natural


14
2017-07-17 17:29



Biar saya sederhananya:

  • HashMap diimplementasikan sebagai tabel hash, dan tidak ada pemesanan pada kunci atau nilai.
  • TreeMap diimplementasikan berdasarkan struktur pohon merah-hitam, dan diperintahkan oleh kunci.
  • LinkedHashMap mempertahankan urutan penyisipan
  • Hashtable disinkronkan, berbeda dengan HashMap. Ini memiliki overhead untuk sinkronisasi. Ini adalah alasan bahwa HashMap harus digunakan jika program ini aman.

10
2018-06-17 11:19