HashMap və Hashtable arasında fərqlər?

Java ilə HashMapHashtable arasında fərq nədir?

Qeyri-axın proqramları üçün daha səmərəli nədir?

3217
02 сент. dmanxiii müəyyən edilir 02 sept. 2008-09-02 23:12 '08 at 11:12 pm 2008-09-02 23:12
@ 39 cavab
  • 1
  • 2

Java ilə HashMapHashtable arasında bir neçə fərq var:

  1. Hashtable synced , lakin HashMap deyil. HashMap obyektlər, odatda, sinxronizasiya edilmiş obyektlərdən daha yaxşı HashMap -in qeyri-axın proqramları üçün daha yaxşı olur.

  2. Hashtable null düymələri və ya dəyərlərinə icazə vermir. HashMap bir null anahtarı və hər hansı bir null dəyər istifadə etməyə imkan verir.

  3. HashMap alt siniflərindən biri LinkedHashMap , buna görə öngörülebilir yineleme sifarişinə (default yerləşdirmə əmrinə) ehtiyac varsa, asanlıqla HashMap üçün LinkedHashMap əvəz edə bilərsiniz. Hashtable istifadə əgər asan olmayacaq.

Sinxronizasiya sizin üçün bir problem olmadığından, HashMap . Sinxronizasiya problem olarsa, siz də ConcurrentHashMap baxa bilərsiniz.

3297
03 сент. Cavab Josh Brown tərəfindən verilmişdir 03 Sep. 2008-09-03 02:02 '08 saat 02:02 'da 2008-09-03 02:02

Ən cavablar Hashtable'ın sinxronlaşdırıldığını göstərir. Praktikada çox az satın alır. Accessor / mutator metodlarında sinxronizasiya eyni zamanda kartdan əlavə və ya çıxarmaqla iki mövzu dayandırır, ancaq real dünyada daha çox əlavə sinxronizasiya lazımdır.

Çox ümumi bir deyim "yoxlamaq, sonra qoymaq" deməkdir, yəni kart üzərində bir qeyd axtarmaq və mövcud olmadıqda əlavə edin. Bir Hashtable və ya HashMap istifadə edərkən bu heç bir atom əməliyyat deyil.

Eşzamanlı senkronize edilmiş HashMap əldə edilə bilər:

 Collections.synchronizedMap(myMap); 

Lakin bu məntiqin düzgün tətbiq edilməsi üçün əlavə formada sinxronizasiya lazımdır:

border=0
 synchronized(myMap) { if (!myMap.containsKey("tomato")) myMap.put("tomato", "red"); } 

Hashtable girişləri (və ya Collections.synchronizedMap tərəfindən əldə edilən HashMap) üzərində hətta təkrarlamaq, əlavə kartı əlavə sinxronizasiya ilə dəyişmədən kartı qorumaq üçün işləməyəcəkdir.

ConcurrentMap interfeysinin həyata keçirilməsi (məsələn, ConcurrentHashMap ) bu məsələnin bir qismini həll edir , məsələn:

 ConcurrentMap.putIfAbsent(key, value); 
598
03 сент. Cavab verilir serg10 03 s. 2008-09-03 14:00 '08 saat 14:00 'də, 2008-09-03 14:00' də

Hashtable köhnəlmiş kod hesab edilir. Hashtable HashMap və ya HashMap türevləri istifadə edilə bilməz, buna görə yeni kod üçün Hashtable qayıtmaq üçün bir səbəb görmürəm.

302
25 июня '09 в 4:46 2009-06-25 04:46 Cavab aberrant80 iyun 25 '09 saat 04:46 'da verildi 2009-06-25 04:46

Bu sual tez-tez namizədlərin toplama dərslərinin düzgün istifadə edilməsini başa düşdüyünü və mövcud alternativ həllərdən xəbərdar olduğunu yoxlamaq üçün müsahibələrdə soruşulur.

  • HashMap sinfi, Hashtable'a təxminən bərabərdir, yalnız sinxronlaşdırılmır və null verir. (HashMap, null dəyərlərə əsas və dəyər kimi imkan verir, Hashtable isə null dəyərlərə icazə vermir).
  • HashMap kartın sifarişinin vaxtla dəyişməyəcəyinə zəmanət vermir.
  • HashMap sinxronizasiya edilmir, hashtable isə sinxronlaşdırılır.
  • Bir HashMap'taki yineleyici, öz remove () Iterator metodundan başqa hər hansı elementi əlavə edərək və ya aradan qaldıraraq strukturunu strukturca dəyişdirsə, Hashtable üçün sayımcı bir ConcurrentModificationException deyil və atır. Amma bu, davranışa zəmanət vermir və JVM tərəfindən ən yaxşı səy göstərəcək.

Bəzi mühüm şərtlərə dair qeyd.

  • Sinxronlaşdırılan deməkdir ki, yalnız bir mövzu bir vaxtda bir neçə dəfə hash masasını dəyişə bilər. Əslində bu deməkdir ki, hər hansı bir mövzu hash masasında bir yeniləmə yerinə yetirməkdən əvvəl obyektin kilidini almaq məcburiyyətində olacaq, digərləri isə kilidinin sərbəst buraxılmasını gözləyir.
  • Hata dözümlülüyü yineleyicilərin kontekstinə aiddir. Yəni iterator toplama obyektində yaradılıb və başqa bir mövzu toplama obyektini "strukturca" dəyişdirməyə çalışırsa, paralel modifikasiya istisna seçiləcəkdir. Digər mövzular üçün "toplusu" üsuluna ən azı bir zəngdən istifadə edə bilərsiniz, çünki bu kolleksiya "strukturca" dəyişdirməz. Lakin, toplama "set" çağırmadan əvvəl struktur dəyişikliyə uğrarsa, "IllegalArgumentException" seçiləcək.
  • Struktur dəyişiklik xəritənin strukturunu təsirli şəkildə dəyişdirə biləcək elementin çıxarılması və ya yerləşdirilməsini nəzərdə tutur.

HashMap istifadə edərək sinxronizasiya edilə bilər

Map m = Collections.synchronizeMap(hashMap);

Xəritə, təkrar iterativ dəstəyin yerinə Enumeration obyektləri vasitəsilə toplama baxımından təmin edir. Kolleksiyanın görünüşü, bu bölmənin daha sonra müzakirə edildiyi kimi, interfeysin ifadəliyini əhəmiyyətli dərəcədə yaxşılaşdırır. Xəritə, düymələri, dəyərləri və ya açar dəyər cütləri təkrarlamaq üçün imkan verir; Hashtable üçüncü bir seçim vermir. Kart bir iteration ortasında qeydləri silmək üçün təhlükəsiz bir yol təqdim edir; Hashtable bunu etməyib. Nəhayət, Xəritə Hashtable interfeysində kiçik qüsurları düzəldir. Hashtable, Hashtable'da belirtilen değeri içeriyorsa, doğru olaraq dönen bir metodu ehtiva edir. Adını nəzərə alaraq, bu metod Hashtable bu açarı içərsə, həqiqətə dönməsini gözləyirsiniz, çünki əsas Hashtable üçün əsas vasitədir. Xəritə interfeysi, bu qaynaq qaynağını "Valile" metodunun adını dəyişərək aradan qaldırır. Bundan əlavə, interfeysin ardıcıllığını yaxşılaşdırır - ehtiva Paralellər ehtiva edirKey.

Card interface

154
04 окт. cavab 04 avqust cümə günü verilir . 2011-10-04 09:39 '11 at 9:39 2011-10-04 09:39

HashMap : array indeksləşdirmək üçün hash kodları istifadə edən Map interface, tətbiqi. Hashtable : Salam, 1998. Onlar öz koleksiyonlarının API qaytarmaq istəyirlər.

Ciddi, amma Hashtable uzaq durun. Tək yivli tətbiqlər üçün əlavə sinxronizasiya yükünü tələb etmirsiniz. Yüksək rəqabətli tətbiqlər üçün paranoyak sinxronizasiya aclıq, dayaq və ya zibil toplanması üçün lazımsız dayandırmaları dayandırmağa gətirib çıxara bilər. Tim Howland qeyd etdiyimiz kimi, bunun yerine, ConcurrentHashMap istifadə edə bilərsiniz.

108
03 сент. Cavab Apocalisp tərəfindən verilib 03 Sep. 2008-09-03 02:14 '08 at 02:14 2008-09-03 02:14

Java Koleksiyonları Çerçevesi (JCF) kütüphanesinin uygulanması ve daha sonra Map arayüzünü uygulamak üçün güncellenmeden önce HashTable devralınmış bir sınıf olduğunu unutmayın. VectorStack belə oldu.

Buna görə, həmişə yeni kodda onlardan uzaq durun, çünki JCF-da başqalarının diqqətinə çatdıqları kimi daha yaxşı bir alternativ var.

Burada faydalı tapa biləcəyiniz Java kəşfiyyat kartlarının bir kolleksiyası . Gri qutunun köhnəlmiş HashTable sinfi, Vector və Stack ehtiva etdiyini unutmayın.

2019

107
25 марта '14 в 11:58 2014-03-25 11:58 Cavab pierrotlefou verilir 25 Mart 'da 11:58 2014-03-25 11:58

İzbinin nə dediyinə əlavə olaraq, HashMap işə yaramır isə boş dəyərlər üçün imkan verir.

Həmçinin qeyd edək ki, Hashtable , Javadoc dövləti kimi köhnəlmiş və bir Map ilə əvəzlənən Dictionary sinifini genişləndirir.

59
02 сент. cavab mat b 02 sep verilir. 2008-09-02 23:30 '08 saat 23:30 'da 2008-09-02 23:30

Bu charta bir göz atın. HashMap və Hashtable ilə birlikdə müxtəlif məlumat strukturları arasında müqayisə edir. Müqayisə, dəqiq, anlaşılabilir və başa düşüləndir.

Java Collection Matrix

51
20 нояб. Cavab Sujan 20 noyabrda verilir . 2012-11-20 08:35 '12 saat 08:35 'da 2012-11-20 08:35

Hashtable HashMap bənzər və oxşar bir interfeysə sahibdir. HashMap dan istifadə etmək HashMap əgər köhnə tətbiqlərə dəstək lazım deyilsə və ya Hashtables metodları sinxronlaşdırıldıqdan sonra senkronizasiya lazımdır. Beləliklə, çox işıqlı olduğunuz halda, HashMaps ən yaxşı seçimdir.

40
02 сент. Cavab Miles D 02 Sep verilir. 2008-09-02 23:25 '08 at 23:25 2008-09-02 23:25

Artıq dərc edilmiş çox yaxşı cavab var. Bir neçə yeni maddə əlavə edirəm və onları yekunlaşdırıram.

HashMapHashtable , məlumatların bir açar və dəyər şəklində saxlanması üçün istifadə olunur. Hər ikisi də unikal düymələri saxlamağa hashing üsulundan istifadə edirlər. Lakin aşağıda göstərilən HashMap və Hashtable dərsləri arasında çox fərq var.

Hashmap

  1. HashMap sinxronizasiya edilmir. Bu mövzu təhlükəsiz deyil və düzgün bir sinxronizasiya kodu olmadan bir çox mövzu arasında bölüşdürülə bilməz.
  2. HashMap bir sıfır anahtarı və bir neçə sıfır dəyər istifadə etməyə imkan verir.
  3. HashMap JDK 1.2-də təqdim edilən yeni bir sinifdir.
  4. HashMap sürətli.
  5. Bu kodu çağıraraq HashMap sinxronizasiya edə bilərik.
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap Iterator vasitəsilə keçir.
  7. HashMap iterator sürətli işləmir.
  8. HashMap AbstractMap sinifini devralır.

Hash masa

  1. Sinxronlaşdırılmış Hashtable . Bu mövzu təhlükəsizdir və bir çox mövzu ilə istifadə edilə bilər.
  2. Hashtable hər hansı bir boş düyməyə və ya dəyərə icazə vermir.
  3. Hashtable mirasçı bir sinifdir.
  4. Hashtable yavaş.
  5. Hashtable daxili sinxronizasiya edilir və senkronizasiya edilə bilməz.
  6. Hashtable , Enumerator və Iterator vasitəsilə keçir.
  7. Hashtable sürətli deyil.
  8. Hashtable bir lüğət Hashtable devralır.

Əlavə oxu. Java ilə HashMap və Hashtable arasında fərq nədir?

2019

06 марта '17 в 13:09 2017-03-06 13:09 rootraveller tərəfindən verilmiş cavab 06 mart '17 'da 13:09 2017-03-06 13:09

Hashtable və hashmap arasında bir əsas fərq, HashMap Iterator düzgün işləmir, Hashtable üçün sayımcısı isə başqa bir element strukturunu dəyişdirsə, başqa bir element əlavə etməzdən və ya öz xaricindən başqa bir şey çıxararsa bir ConcurrentModificationException deyil və atır İterator çıxarın (). Amma bu davranışa zəmanət verilmir və JVM tərəfindən ən yaxşı səylə icra ediləcək. "

Mənbə: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html

31
08 сент. Cavab Neerja 08 Sep tərəfindən verilir. 2011-09-08 09:40 '11 at 9:40 'da 2011-09-08 09:40

Buradakı bütün digər vacib aspektlərə əlavə olaraq, koleksiyonlar API (məsələn, xəritə interfeysi) daima Java spesifikasiyasına ən son və ən böyük əlavələrə uyğun olaraq dəyişir.

Məsələn, Java 5 Xəritəini yineleyin:

 for (Elem elem : map.keys()) { elem.doSth(); } 

köhnə yanaşma qarşı Hashtable:

 for (Enumeration en = htable.keys(); en.hasMoreElements(); ) { Elem elem = (Elem) en.nextElement(); elem.doSth(); } 

Java 1.8-də, həmçinin köhnə köhnə yazılarda olduğu kimi, HashMaps qurmaq və çıxış etmək sözü verilir:

 Map<String,Integer> map = { "orange" : 12, "apples" : 15 }; map["apples"]; 

Yeniləmə: Xeyr, onlar 1,8 ... -ə düşməyəcəklər: (

JDK8-də sikkələrin toplanmasının genişləndirilməsi mümkündürmü?

29
12 янв. Cavab 12 yanvarda verilir 2012-01-12 12:17 '12 at 12:17 2012-01-12 12:17
  • HashTable sinxronizasiya edilir, bir iş parçacığında istifadə edərsəniz , HashMap , uyğun olmayan bir versiyasıdır. Sinxronizasiya edilmiş obyektlər tez-tez bir az daha səmərəlidir. Yeri gəlmişkən, əgər bir neçə mövzu HashMap-ə eyni zamanda daxil olarsa və mövzuların ən azı birinə struktur dəyişirsə, o, kənardan sinxronlaşdırılmalıdır. Youn, sinxronizasiya edilmiş rejimdə qeyri-sinxronizasiya edilmiş xəritəni istifadə edərək:

     Map m = Collections.synchronizedMap(new HashMap(...)); 
  • HashTable, yalnız bir qeyri-sıfır obyekti və ya bir dəyər kimi ola bilər. HashMap bir sıfır açar və sıfır dəyər ehtiva edə bilər.

  • Xəritə işlədikdən sonra, işarator öz silmə metodundan başqa hər hansı bir şəkildə yineleyiciyi yaratdıqdan sonra hər hansı bir şəkildə strukturlaşdırılmış şəkildə dəyişdirildikdə, Xəritə işi ilə işləyən yineleyicilər, ConcurrentModificationException . Belə ki, eşzamanlı dəyişiklik qarşısında iterator sürətli və təmizdir, , gələcəkdə qeyri-deterministik davranışa qeyri-müəyyən bir vaxtda davranır. Nömrələrin açarları və Hashtable elementləri tərəfindən qayıtdıqda sürətli deyil.

  • HashTable və HashMap, Java Koleksiyonları Çerçevesinin üzvləridir (Java 2 v1.2 platformasından bu yana, HashTable Xəritə həyata keçirmək üçün təkmilləşdirilmişdir).

  • HashTable, köhnəlmiş kod olaraq qəbul edilir, sənədlər, akışkan bir şəkildə paralel bir tətbiq həyata keçirmək istənirsə, Hashtable yerinə ConcurrentHashMap istifadə məsləhətdir.

  • HashMap elementlərin qaytarılmasını təmin etmir. HashTable üçün mən də eyni şey olduğunu varsayıyorum, amma mən əmin deyiləm ki, bunu açıq şəkildə ifadə edən bir ressource tapmıram.

26
29 апр. cavab alain.janinm 29 aprel verilir 2012-04-29 16:57 '12 at 16:57 2012-04-29 16:57

HashMapHashtable da əhəmiyyətli alqoritm fərqlər var. Heç kim bundan əvvəlki sözü deməmişdi, buna görə onu gətirdim. HashMap , iki ölçülü bir hash masa quracaq, dinamik şəkildə artırar, belə ki, hər hansı bir kovada səkkiz elementdən (çarpışmadan) artıq olmayacaq və ümumi element növlərinə elementləri qarışdırmaq çox yaxşı olacaq. Hashtable tətbiqi, nə etdiyinizi bildiyiniz halda, məsələn, masanın ölçüsünü, məsələn, dəyərinizin ölçüsünə düzəltmək üçün daha yaxşı və daha həssas nəzarət verir və bu HashMap-dən daha yaxşı işləməyə gətirib çıxaracaqdır. . bəzi hallarda daha az münaqişəyə yol açır.

Bu sualı geniş müzakirə edilən açıq fərqli fərqli olaraq, Hashtable'ı hashing'i daha yaxşı bir şəkildə idarə edərkən və "HashMap" adətən yaxşı işləyən bir "avtomatik drive" kimi "əl sürücüsü" kimi görürəm.

24
10 дек. Cavab SkyWalker tərəfindən verilir. 2012-12-10 11:57 '12 at 11:57 2012-12-10 11:57

Hashtable synced, lakin HashMap deyil. Bu, bir hashmap daha yavaş hashtable edir.

Qeyri-axın proqramları üçün, HashMap istifadə edin, çünki onlar funksionallıq baxımından eynidır.

22
02 сент. Cavab verilir izb 02 Sentyabr 2008-09-02 23:22 '08 at 11:22 2008-09-02 23:22

Burada məlumatlara əsaslanaraq, HashMap ilə gedəcəyimi məsləhət görürəm. Hesab edirəm ki, ən böyük üstünlük, yəni iterator vasitəsilə etmədiyiniz təqdirdə, Java üzərində onu yineleyken dəyişməyinizə imkan verməyəcəkdir.

20
02 сент. cavab 02 yanvar tarixinə verilir. 2008-09-02 23:14 '08 at 11:14 pm 2008-09-02 23:14

Java ilə HashMapHashtable arasında fərqlər:

1) Təhlükəsizdir

  • HashTable daxili olaraq sinxronlaşdırılır.
  • Buna görə, HashTable'ı çox yivli tətbiqlərdə istifadə etmək çox rahatdır.
  • HashMap'in daxili olaraq sinxronlaşmadığı yer.
  • Buna görə, xarici sinxronizasiyadan çox işıqlı proqramlarda HashMap istifadə etmək təhlükəsiz deyil.
  • Siz Collections.synchronizedMap () metodunu istifadə edərək kənardan HashMap sinxronizasiya edə bilərsiniz.

2)

  • Həm HashMap həm də HashTable interfeysləri Map interfeysini tətbiq edirlərsə də, iki fərqli sinfi genişləndirirlər.
  • HashMap, AbstractMap sinifini genişləndirir, burada HashTable java-da miraslı bir sinif olan Class Dictionary'i genişləndirir.

3) sıfır düymələri və sıfır dəyərlər

  • HashMap, bir sıfır anahtarı və hər hansı sıfır dəyərdən maksimum istifadə etməyə imkan verir.
  • HashTable kimi, hətta bir sıfır açar və sıfır dəyərə icazə vermir.

4) Bypass

  • HashMap yalnız HashMap elementlərinə getmək üçün istifadə edilən yandırıcıları qaytarır.
  • HashTable bir Iterator'ı və bir HashTable elementləri arasında gezinmek üçün istifadə edilə bilən bir Numaralayı qaytarır.

5) Fail-Fast Vs Fail-Safe

  • HashMap tərəfindən döndürülen iterator, təbiət ilə uyğun deyildir, yəni iterator, öz remove () metodu istisna olmaqla, HashMap bir Iterator yaratdıqdan sonra dəyişdirildikdə bir ConcurrentModificationException atırlar.
  • Digər tərəfdən, HashTable tərəfindən geri sayım təbiətdə səhv tolerantdır, yəni HashTable bir Numaralandırma yaratdıqdan sonra dəyişirsə istisna etməyəcəklər.

6) Performans

  • HashTable məcburi senkronize olduğundan, bu HashTable'ı HashMap-dən daha yavaş edir.

7) Legacy Class

  • HashTable mirasçı bir sinifdir.
  • Bu demək olar ki, qəbuledilməz sayılır.
  • JDK 1.5-ci ildən, ConcurrentHashMap HashTable-dan daha yaxşı bir seçim sayılır.

8) Java üçün Çərçivə Üzvü

  • HashMap JDK 1.2-də yaranandan bəri Java Collection Çərçivə Üzvü üzvü olmuşdur.
  • Lakin HashTable JDK 1.2 əvvəl orada idi. JDK 1.2, Xəritə qurma sisteminin bir hissəsini təşkil edən Map interfeysini həyata keçirmək üçün hazırlanmışdır.

2019

30 сент. Cavab Preya 30 Sentyabr verilir. 2016-09-30 10:18 '16 saat 10:18 'da 2016-09-30 10:18

Çox yivli tətbiqlər üçün, Performans tələblərinizdən asılı olaraq, tez-tez ConcurrentHashMap ilə uzaqlaşa bilərsiniz.

15
03 сент. Cavab Tim Hood tərəfindən verilmişdir 03 Sep. 2008-09-03 01:38 '08 at 1:38 2008-09-03 01:38

Bəzən konteyner adlanan bir Collection - sadəcə bir blokda bir neçə elementi birləşdirən obyektdir. Collection məcmu məlumatların saxlanması, geri alınması, manipulyasiya edilməsi və mübadiləsi üçün istifadə olunur. W kolleksiyası koleksiyonları təmsil etmək və idarə etmək üçün bir arxitektur.

HashMap JDK1.2 və Hashtable JDK1.0 ikisi <Key, Value> JDK1.0 təmsil olunan obyektlərin bir qrupunu təmsil etmək üçün istifadə olunur. <Key, Value> hər cütü bir Entry obyekti adlanır. Rekord yığımı HashMapHashtable obyektlərinə aiddir. Kolleksiyadakı düymələr unikal və ya fərqli olmalıdır. [çünki müəyyən bir əsasın ekran dəyərini almaq üçün istifadə olunur. kolleksiyada dəyərlər təkrarlana bilər.]


" Superclass Üyelik, Miras ve Derleme

Hashtable, JDK1.0 alt sinfi olan JDK1.0 tətbiq olunan JDK1.0 bir sinifdir. JDK1.2 dən JDK1.2 Hashtable, toplama strukturunun üzvü olmaq üçün xəritə interfeysini həyata keçirmək üçün yenidən işlənmişdir. HashMap JDK1.2-də həyata keçirilməsinin başlanğıcından Java Collection Çərçivəsinin JDK1.2 . HashMap AbstractMap alt sinifidir.

collision " halında, bir kovada bir neçə qeyd saxlanılır, bu da ardıcıl olaraq aranmalıdır.  Yük faktoru gücünün avtomatik olaraq artırılmasından əvvəl tam hash masasının necə əldə olacağının göstəricisidir. 

HashMap, ilk ilkin yük (16) və default load factor (0.75) ilə boş bir masaüstü masa yaradır. Hashtable ilkin ilkin yük (11) və yük / doldurma nisbəti (0.75) ilə boş bir hash masa yaradır.

2019

ответ дан Yash 04 янв. '18 в 14:58 2018-01-04 14:58

Помимо упомянутых различий, следует отметить, что, поскольку Java 8, HashMap динамически заменяет Узлы (связанный список), используемые в каждом ведре с TreeNodes (красно-черным деревом), так что даже если высокие хэш-коллизии существуют, худший случай при поиске -

O (log (n)) для HashMap Vs O (n) в Hashtable .

* Вышеупомянутое улучшение еще не применялось к Hashtable , но только к HashMap , LinkedHashMap и ConcurrentHashMap .

FYI, в настоящее время

  • TREEIFY_THRESHOLD = 8 : если ведро содержит более 8 узлов, связанный список преобразуется в сбалансированное дерево.
  • UNTREEIFY_THRESHOLD = 6 : когда ведро становится слишком маленьким (из-за удаления или изменения размера) дерево преобразуется обратно в связанный список.
13
ответ дан Konstantinos Chalkias 04 мая '16 в 18:04 2016-05-04 18:04

Разница между HashMap и HashTable/HashMap vs HashTable

  • Синхронизация или потоковая безопасность: это самое важное различие между двумя. HashMap не синхронизирован, а не потокобезопасен. С другой стороны, HashTable является потокобезопасным и синхронизированным. Когда использовать HashMap? Ответ: если ваше приложение не требует многопоточной задачи, другими словами hashmap лучше для приложений без потоковой передачи. HashTable следует использовать в многопоточных приложениях.

  • Нулевые ключи и нулевые значения: Hashmap позволяет использовать один нулевой ключ и любое количество нулевых значений, в то время как Hashtable не допускает нулевые ключи и значения null в объекте HashTable.

  • Итерирование значений: значения объекта Hashmap повторяются с помощью итератора .HashTable - это единственный класс, отличный от вектора, который использует перечислитель для итерации значений объекта HashTable.

  • Неудачный итератор: итератор в Hashmap является отказоустойчивым итератором, а перечислитель для Hashtable - нет. Согласно Oracle Docs, если Hashtable структурно модифицируется в любое время после создания итератора любым способом, кроме метода удаления iterator, то итератор будет вызывать ConcurrentModification Exception. Структурная модификация означает добавление или удаление элементов из объекта Collection (здесь hashmap или hashtable). Таким образом, перечисления, возвращаемые ключами и элементами Hashtable, не ускоряются быстро. Мы уже объяснили разницу между итератором и перечислением.

  • Производительность: Hashmap работает намного быстрее и использует меньше памяти, чем Hashtable, поскольку прежняя несинхронизирована. Несинхронизированные объекты часто намного лучше в производительности по сравнению с синхронизированным объектом, например Hashtable, в однопоточной среде.

  • Суперкласс и наследие: Hashtable является подклассом класса Dictionary, который теперь устарел в Jdk 1.7, поэтому он больше не используется. Лучше синхронизировать внешнюю синхронизацию HashMap или использовать реализацию ConcurrentMap (например, ConcurrentHashMap).HashMap является подклассом класса AbstractMap. Хотя Hashtable и HashMap имеют разные суперклассы, но оба они являются реализациями абстрактных типов данных "Карта".

12
ответ дан Moitt 07 мая '15 в 21:27 2015-05-07 21:27

1. Hashmap и HashTable и сохранить ключ и значение.

2. Hashmap может хранить один ключ как null . HashTable не может хранить null .

3. Hashmap не синхронизируется, но HashTable синхронизируется.

4. Hashmap можно синхронизировать с Collection.SyncronizedMap(map)

 Map hashmap = new HashMap(); Map map = Collections.SyncronizedMap(hashmap); 
12
ответ дан Rahul Tripathi 27 авг. '14 в 14:29 2014-08-27 14:29

Мой небольшой вклад:

  • Первым и самым значительным отличием между Hashtable и HashMap является то, что HashMap не является потокобезопасным, а Hashtable является поточно-безопасной коллекцией.

  • Вторым важным отличием между Hashtable и HashMap является производительность, поскольку HashMap не синхронизируется, он работает лучше, чем Hashtable .

  • Третья разница в Hashtable vs HashMap заключается в том, что Hashtable является устаревшим классом, и вы должны использовать ConcurrentHashMap вместо Hashtable в Java.

10
ответ дан Shreyos Adikari 19 марта '14 в 0:46 2014-03-19 00:46

Существует 5 основных различий с HashTable и HashMaps.

  • Карты позволяют выполнять итерацию и извлечение ключей, значений и обеих пар ключ-значение, где HashTable не обладает всей этой возможностью.
  • В Hashtable есть функция contains(), которая очень запутанна в использовании. Потому что смысл содержания немного отклоняется. Значит ли это, содержит ключ или содержит значение? трудно понять. То же самое в Maps имеет функции ContainsKey() и ContainsValue(), которые очень легко понять.
  • В hashmap вы можете удалить элемент во время итерации, безопасно. где это невозможно в хэш-таблицах.
  • Хэш-таблицы по умолчанию синхронизированы, поэтому их можно легко использовать с несколькими потоками. Где по умолчанию HashMaps не синхронизируется, поэтому их можно использовать только с одним потоком. Но вы можете преобразовать HashMap в синхронизированный с помощью функции Collections util class synchronizedMap (Map m).
  • HashTable не разрешает нулевые ключи или нулевые значения. Где, поскольку HashMap допускает один нулевой ключ и несколько нулевых значений.
10
ответ дан user1923551 11 дек. '13 в 15:45 2013-12-11 15:45

HashTable является устаревшим классом в jdk, который больше не должен использоваться. Замените его использование ConcurrentHashMap . Если вы не нуждаетесь в безопасности потоков, используйте HashMap , который не является threadsafe , но быстрее и использует меньше памяти.

8
ответ дан jontejj 15 апр. '13 в 17:49 2013-04-15 17:49

1) Hashtable синхронизируется, а hashmap - нет. 2) Еще одно отличие заключается в том, что итератор в HashMap является отказоустойчивым, а перечислитель для Hashtable - нет. Если вы измените карту во время итерации, вы узнаете.

3) HashMap разрешает в нем нулевые значения, а Hashtable - нет.

7
ответ дан raja 22 янв. '13 в 8:31 2013-01-22 08:31

HashMap: - Это класс, доступный внутри пакета java.util, и он используется для хранения элемента в формате ключа и значения.

Hashtable: -Это унаследованный класс, который распознается внутри рамки коллекции

6
ответ дан Ankit 31 янв. '13 в 16:41 2013-01-31 16:41

Hashtable:

Hashtable - это структура данных, которая сохраняет значения пары ключ-значение. Он не разрешает null для обоих ключей и значений. Вы получите NullPointerException , если вы добавите нулевое значение. Он синхронизирован. Таким образом, это связано с его стоимостью. Только один поток может получить доступ к HashTable в определенное время.

Пример :

 import java.util.Map; import java.util.Hashtable; public class TestClass { public static void main(String args[ ]) { Map<Integer,String> states= new Hashtable<Integer,String>(); states.put(1, "INDIA"); states.put(2, "USA"); states.put(3, null); //will throw NullPointerEcxeption at runtime System.out.println(states.get(1)); System.out.println(states.get(2)); // System.out.println(states.get(3)); } } 

HashMap

HashMap похож на Hashtable , но также принимает пару значений ключа. Он позволяет использовать null для обоих ключей и значений. Его производительность лучше, чем HashTable , потому что это unsynchronized .

Məsələn:

 import java.util.HashMap; import java.util.Map; public class TestClass { public static void main(String args[ ]) { Map<Integer,String> states = new HashMap<Integer,String>(); states.put(1, "INDIA"); states.put(2, "USA"); states.put(3, null); // Okay states.put(null,"UK"); System.out.println(states.get(1)); System.out.println(states.get(2)); System.out.println(states.get(3)); } } 
5
ответ дан IntelliJ Amiya 10 февр. '15 в 10:44 2015-02-10 10:44

HashMap и HashTable

  • Некоторые важные моменты в HashMap и HashTable. пожалуйста, прочтите ниже подробные сведения.

1) Hashtable и Hashmap реализуют интерфейс java.util.Map 2) Hashmap и Hashtable - это коллекция, основанная на хеше. и работает над хэшированием. поэтому это сходство HashMap и HashTable.

  • В чем разница между HashMap и HashTable?

1) Первое отличие заключается в том, что HashMap не является потокобезопасным, а HashTable - ThreadSafe
2) HashMap работает лучше, потому что он не является потокобезопасным. в то время как производительность Hashtable мудрая не лучше, потому что это потокобезопасная. поэтому несколько потоков не могут одновременно обращаться к Hashtable.

5
ответ дан JegsVala 05 июля '14 в 9:27 2014-07-05 09:27

HashMaps дает вам свободу синхронизации и отладки намного проще

4
ответ дан user1506047 09 авг. '12 в 15:28 2012-08-09 15:28
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос