HashMap ir Hashtable skirtumai?

Koks skirtumas tarp „ HashMap ir „ Hashtable “ „Java“?

Kas yra efektyvesnė ne transliacijos programoms?

3217
02 сент. dmanxiii yra nustatytas 02 sept. 2008-09-02 23:12 '08 at 11:12 pm 2008-09-02 23:12
@ 39 atsakymų
  • 1
  • 2

Yra keli skirtumai tarp „ HashMap ir „ Hashtable “ „Java“:

  1. Hashtable sinchronizuojamas , bet „ HashMap “ nėra. Dėl to „ HashMap geriau pritaikoma ne srautinėms programoms, nes nesinchronizuoti objektai paprastai veikia geriau nei sinchronizuoti objektai.

  2. Hashtable “ neleidžia null rakto arba reikšmės. HashMap leidžia naudoti vieną null raktą ir bet kokį null vertės skaičių.

  3. Vienas iš „HashMap“ poklasių yra „ LinkedHashMap , taigi, jei jums reikia nuspėjamos iteracijos tvarkos (kuri yra numatytoji paskirties vietos tvarka), galite lengvai pakeisti „ LinkedHashMapHashMap “. Tai nebūtų taip paprasta, jei naudojote Hashtable .

Kadangi sinchronizavimas jums nėra problema, rekomenduoju HashMap . Jei sinchronizacija tampa problema, taip pat galite peržiūrėti „ ConcurrentHashMap .

3297
03 сент. Atsakymą pateikė Josh Brown 03 Sep. 2008-09-03 02:02 '08 at 2:02 am 2008-09-03 02:02

Atminkite, kad dauguma atsakymų rodo, kad „Hashtable“ yra sinchronizuotas. Praktiškai ji perka labai mažai. Sinchronizavimas prieigos / mutatoriaus metoduose sustabdys dvi temas, tuo pačiu metu pridedant arba išimant iš kortelės, bet realiame pasaulyje dažnai reikės papildomos sinchronizacijos.

Labai dažna idioma yra „patikrinti, tada įdėti“, tai yra, ieškoti įrašo ant kortelės ir pridėti ją, jei ji dar nėra. Tai jokiu būdu nėra atominė operacija, jei naudojate Hashtable arba HashMap.

Galima gauti lygiavertį sinchronizuotą „HashMap“:

 Collections.synchronizedMap(myMap); 

Tačiau norint teisingai įgyvendinti šią logiką, jums reikia papildomos formos sinchronizacijos :

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

Net pasikartojant per „Hashtable“ įrašus (arba „HashMap“, gautus iš „Collection.synchronizedMap“), nėra apsaugoti, nebent jūs taip pat apsaugotumėte kortelę nuo pakeitimų su papildoma sinchronizacija.

ConcurrentMap“ sąsajos įgyvendinimas (pvz., „ ConcurrentHashMap“ ) išsprendžia kai kuriuos iš jų, įtraukiant temą „saugaus patikrinimo“ ir „veiksmo“ semantiką , pavyzdžiui:

 ConcurrentMap.putIfAbsent(key, value); 
598
03 сент. atsakymas pateikiamas serg10 03 sep . 2008-09-03 14:00 '08 14:00 val. 2008-09-03 14:00

Hashtable laikomas pasenusiu kodu. Hashtable nieko negalima padaryti naudojant „ HashMap ar „ HashMap išvestinius sprendimus, todėl naujam kodui nematau priežasties grįžti į „ Hashtable .

302
25 июня '09 в 4:46 2009-06-25 04:46 atsakymas pateikiamas aberrant8080 birželio 25 d., 09:46, 2009-06-25 04:46

Interviu metu šis klausimas dažnai užduodamas siekiant patikrinti, ar kandidatas supranta, kaip tinkamai naudojamasi rinkinių klasėms, ir žino, kokie yra alternatyvūs sprendimai.

  • „HashMap“ klasė yra maždaug lygiavertė „Hashtable“, išskyrus tai, kad ji nėra sinchronizuota ir leidžia „null“. („HashMap“ leidžia nulinę reikšmę kaip raktą ir vertę, o Hashtable neleidžia nulinės vertės).
  • „HashMap“ negarantuoja, kad kortelės užsakymas laikui bėgant nepasikeis.
  • HashMap nėra sinchronizuotas, o Hashtable sinchronizuojamas.
  • „HashMap“ iteratorius yra tolerantiškas, o „Hashtable“ skaičiuoklė nėra ir išmeta „ConcurrentModificationException“, jei bet kuris kitas sriegis struktūrą struktūriškai modifikuoja pridedant arba pašalindamas bet kurį elementą, išskyrus savo pašalinimo () Iterator metodą. Tačiau tai nėra garantuotas elgesys ir JVM atliks geriausias pastangas.

Pastaba dėl tam tikrų svarbių terminų.

  • Sinchronizuotas reiškia, kad tik vienas gija gali pakeisti maišos lentelę tam tikru momentu. Iš esmės tai reiškia, kad bet kuris pokalbis turės gauti objekto užraktą prieš atliekant naujinimą ant maišos lentelės, o kiti laukia, kol bus paleistas užraktas.
  • Klaidos tolerancija reiškia iteratorių kontekstą. Jei iteratorius buvo sukurtas rinkimo objekte, o kai kurie kiti siūlai bando keisti surinkimo objektą „struktūriškai“, bus pasirinkta lygiagrečių pakeitimų išimtis. Kitoms temoms galite naudoti bent jau skambutį į „nustatyti“ metodą, nes jis nekeičia kolekcijos „struktūriškai“. Tačiau, jei rinkinys buvo struktūriškai pakeistas prieš skambinant „rinkinys“, bus pasirinkta „IllegalArgumentException“.
  • Struktūrinis pakeitimas - tai elemento, galinčio veiksmingai pakeisti žemėlapio struktūrą, pašalinimas arba įdėjimas.

HashMap galima sinchronizuoti naudojant

Map m = Collections.synchronizeMap(hashMap);

Žemėlapyje vietoj tiesioginio iteravimo palaikymo per Enumeration objektus pateikiami kolekcijos vaizdai. Kolekcijos išvaizda žymiai pagerina sąsajos išraiškingumą, kaip aptarta šiame skyriuje. Žemėlapyje galite kartoti per raktus, vertes arba raktų vertės poras; Hashtable nepateikia trečiosios galimybės. Kortelė suteikia saugų būdą, kaip ištrinti įrašus iteracijos viduryje; Hashtable to nepadarė. Galiausiai, žemėlapis nustato nedidelį „Hashtable“ sąsajos trūkumą. Hashtable turi metodą, vadinamą „yra“, kuris grąžina teisingą, jei „Hashtable“ turi nurodytą vertę. Atsižvelgiant į jo pavadinimą, tikitės, kad šis metodas grįš teisingai, jei „Hashtable“ yra šis raktas, nes raktas yra pagrindinis „Hashtable“ prieigos mechanizmas. Žemėlapio sąsaja pašalina šį painiavos šaltinį, pervardydama į „VertValue “metodą. Be to, jis pagerina sąsajos nuoseklumą - jame yra „Vertės paralelės“ yra „Key“.

Kortelės sąsaja

154
04 окт. atsakymas pateikiamas sravan 04 okt. 2011-10-04 09:39 '11 at 9:39 2011-10-04 09:39

HashMap : Map sąsajos diegimas, kuriame matricos indeksavimui naudojamas maišos kodai. Hashtable : Sveiki, 1998. Jie nori grąžinti savo kolekcijų API.

Rimtai, bet jums geriau likti nuošalyje nuo Hashtable . Vieno sriegio taikomosioms programoms nereikia papildomos sinchronizacijos pridėtinės vertės. Dėl labai konkurencingų taikomųjų programų, paranoiška sinchronizacija gali nulemti badą, užsikimšimą ar nereikalingas pauzes šiukšlių surinkimui. Kaip pažymėjo Timas Howlandas, galite naudoti „ ConcurrentHashMap .

108
03 сент. Atsakymą pateikė Apocalisp 03 Sep. 2008-09-03 02:14 '08 at 2:14 nuo 2008-09-03 02:14

Atminkite, kad „ HashTable buvo paveldėta klasė, kol nebuvo įdiegta „Java“ kolekcijų pagrindų (JCF) biblioteka ir vėliau atnaujinta, kad būtų įdiegta Map sąsaja. Taip buvo ir „ Vector bei „ Stack .

Todėl visada laikykitės naujojo kodo, nes JCF visada yra geresnė alternatyva, kaip nurodė kiti.

Čia yra Java „cheat“ kortelių , kurias rasite naudinga, rinkinys . Atkreipkite dėmesį, kad pilka dėžutė turi pasenusią „HashTable“ klasę, „Vector“ ir „Stack“.

2019

107
25 марта '14 в 11:58 2014-03-25 11:58 atsakymas pateikiamas pierrotlefou kovo 25 d. 14 val. 11:58 2014-03-25 11:58

Be to, ką sakė izb, „ HashMap leidžia nulinės vertės, o „ Hashtable neveikia.

Taip pat atkreipkite dėmesį, kad „ Hashtable praplečia Dictionary klasę, kuri, kaip „ Javadocs“ būklė, yra pasenusi ir pakeista Map .

59
02 сент. atsakymas pateikiamas matt b 02 sep. 2008-09-02 23:30 '08, 23:30, 2008-09-02 23:30

Pažvelkite į šią diagramą. Ji suteikia palyginimą tarp įvairių duomenų struktūrų kartu su „HashMap“ ir „Hashtable“. Palyginimas yra tikslus, suprantamas ir suprantamas.

Java kolekcijos matrica

51
20 нояб. atsakymas duotas Sujan 20 nov. 2012-11-20 08:35 '12 8:35 am 2012-11-20 08:35

Hashtable yra panašus į „ HashMap ir turi panašią sąsają. Rekomenduojama naudoti „ HashMap jei nereikia palaikyti senųjų programų arba jums reikia sinchronizacijos, nes sinchronizuojami „ Hashtables metodai. Taigi jūsų atveju, nes jūs nesate daug sriegis, „ HashMaps yra geriausias pasirinkimas.

40
02 сент. Atsakymas pateiktas Miles D 02 Sep. 2008-09-02 23:25 '08, 23:25, 2008-09-02 23:25

Jau paskelbtas geras atsakymas. Pridedu keletą naujų elementų ir juos apibendrinu.

HashMap ir „ Hashtable naudojami duomenims saugoti kaip raktas ir vertė. Abu raktai išsaugomi naudojant „hashing“ metodą. Tačiau yra daug skirtumų tarp „HashMap“ ir „Hashtable“ klasių, kurios yra išvardytos žemiau.

Hashmap

  1. HashMap nėra sinchronizuotas. Tai nėra sriegis saugus ir negali būti dalijamasi tarp daugelio siūlų be tinkamo sinchronizavimo kodo.
  2. HashMap leidžia naudoti vieną nulinį raktą ir kelias nulines reikšmes.
  3. HashMap yra nauja klasė, pristatyta JDK 1.2.
  4. HashMap yra greitas.
  5. Mes galime sinchronizuoti „ HashMap “ skambindami šiuo kodu.
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap eina per Iterator.
  7. HashMap “ iteratorius neveikia greitai.
  8. HashMap paveldi AbstractMap klasę.

Hash lentelė

  1. Sinchronizuotas Hashtable . Tai saugus sriegis ir gali būti naudojamas su daugeliu sriegių.
  2. Hashtable neleidžia bet kokio nulinio rakto arba vertės.
  3. Hashtable yra paveldėta klasė.
  4. Hashtable lėtas.
  5. Hashtable sinchronizuota viduje ir negali būti sinchronizuota.
  6. Hashtable eina per Enumerator ir Iterator.
  7. Hashtable skaitiklis nėra greitas.
  8. Hashtable paveldi žodyno klasę.

Tolesnis skaitymas. Koks skirtumas tarp „HashMap“ ir „Hashtable“ „Java“?

2019

06 марта '17 в 13:09 2017-03-06 13:09 „ roottraveller“ atsakymas kovo 6 d. 17 d. 13:09 2017-03-06 13:09

Kitas svarbus skirtumas tarp „hashtable“ ir „hashmap“ yra tai, kad „HashMap Iterator“ neveikia tinkamai, o „Hashtable“ skaičiuoklė nėra ir išmeta ConcurrentModificationException, jei bet kuris kitas srautas struktūrą struktūriškai modifikuoja, prideda arba pašalina bet kurį kitą elementą, išskyrus savo elementą Iterator pašalinkite (). Bet tai neužtikrinamas elgesys ir JVM atliks geriausias pastangas. “

Mano šaltinis: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html

31
08 сент. Atsakymą pateikė Neerja, rugsėjo 8 d. 2011-09-08 09:40 '11 at 9:40 2011-09-08 09:40

Be visų kitų svarbių čia jau minėtų aspektų, rinkinių API (pvz., Žemėlapio sąsaja) nuolat keičiasi, kad atitiktų naujausius ir didžiausius „Java“ specifikacijos papildymus.

Pavyzdžiui, palyginkite „Java“ 5 žemėlapio kartotinį:

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

prieš seną požiūrį Hashtable:

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

„Java 1.8“ taip pat pažadame kurti ir pasiekti „HashMaps“, kaip ir senuose senuosiuose scenarijuose:

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

Atnaujinimas: Ne, jie nebus iškrauti 1.8 ...: (

Ar JDK8 gali būti pagerinta monetų kolekcija?

29
12 янв. atsakymas pateiktas pwes Jan 12 2012-01-12 12:17 '12 12:17 2012-01-12 12:17
  • „HashTable“ yra sinchronizuotas, jei naudojate jį vienoje siūloje , galite naudoti „ HashMap“ , kuri yra sinchronizuota versija. Nesinchronizuoti objektai dažnai yra šiek tiek efektyvesni. Beje, jei keletas sričių vienu metu pasiekia „HashMap“, o bent vienas iš sriegių struktūrą keičia, ji turi būti sinchronizuota iš išorės. „Youn“ gali sinchronizuotu režimu suvynioti sinchronizuotą žemėlapį naudojant:

     Map m = Collections.synchronizedMap(new HashMap(...)); 
  • „HashTable“ gali turėti tik nulinį objektą kaip raktą arba kaip vertę. „HashMap“ gali būti vienas nulis ir nulinės vertės.

  • Iteratoriai, kuriuos sugrąžino žemėlapis, veikia su klaida, jei žemėlapis bet kuriuo metu po to, kai sukuriamas iteratorius, yra struktūriškai modifikuotas, bet kokiu kitu būdu nei iteratoriaus ištrynimo metodas, iteratorius išmeta „ ConcurrentModificationException . - neapibrėžtas elgesys neribotą laiką ateityje. Nors raktų ir „Hashtable“ elementų grąžinti skaičiai nėra greitai.

  • „HashTable“ ir „HashMap“ yra „ Java“ kolekcijų sistemos nariai (nuo „Java 2 v1.2“ platformos „HashTable“ buvo atnaujintas, kad būtų įgyvendintas žemėlapis).

  • „HashTable“ laikomas pasenusiu kodu, dokumentuose rekomenduojama vietoj „Hashtable“ naudoti „ ConcurrentHashMap“ , jei pageidautina, kad lygiagrečiai būtų įgyvendinamas srautas.

  • „HashMap“ negarantuoja prekių grąžinimo. „HashTable“ atveju manau, kad tai yra tas pats dalykas, bet nesu visiškai tikras, kad nerandu išteklių, kuris tai aiškiai nurodo.

26
29 апр. atsakymas pateikiamas alain.janinm balandžio 29 d 2012-04-29 16:57 '12 at 16:57 2012-04-29 16:57

HashMap ir Hashtable taip pat turi didelių algoritminių skirtumų. Niekas to nepaminėjo, taigi aš jį atnešiu. HashMap dviejų dydžių talpyklos stalą, dinamiškai padidins, todėl jūs neturėsite daugiau kaip aštuonių elementų (susidūrimų) bet kurioje kibiroje ir bus labai gerai maišyti elementus bendrų tipų elementams. Tačiau „ Hashtable “ įgyvendinimas užtikrina geresnį ir subtilesnį valdymą, jei žinote, ką darote, būtent, galite koreguoti lentelės dydį, pvz., Artimiausią pirminį skaičių iki savo vertės dydžio, ir tai padės geriau nei „HashMap“, t.y. . kai kuriais atvejais mažiau konfliktų.

Skirtingai nei akivaizdūs skirtumai, kurie plačiai aptariami šiame klausime, matau „Hashtable“ kaip „rankinį diską“, kur geriau valdote maišymą, o „HashMap“ kaip „automatinį diską“, kuris paprastai veikia gerai.

24
10 дек. Atsakymą pateikė „ SkyWalker“ . 2012-12-10 11:57 '12 11:57 2012-12-10 11:57

Hashtable sinchronizuojamas, bet „HashMap“ nėra. Tai palengvina lėtesnį nei „hashmap“.

Jei naudojate ne srautines programas, naudokite „HashMap“, nes jie kitaip yra funkcionalumo požiūriu.

22
02 сент. atsakymas duotas izb 02 Sep 2008-09-02 23:22 '08 at 11:22 2008-09-02 23:22

Remdamiesi čia pateikta informacija, rekomenduoju eiti su „HashMap“. Manau, kad didžiausias privalumas yra tai, kad „Java“ neleis jums ją keisti, kol jūs jį kartosite, nebent tai atliksite per iteratorių.

20
02 сент. atsakymas duodamas atvirkščiai 02.09. 2008-09-02 23:14 '08 at 23:14 pm 2008-09-02 23:14

HashMap“ ir „ Hashtable“ skirtumai „Java“:

1) Saugus

  • „HashTable“ yra sinchronizuota viduje.
  • Todėl labai patogu naudoti „HashTable“ daugiaukelėse programose.
  • Kai „HashMap“ nėra sinchronizuojamas viduje.
  • Todėl nėra saugu naudoti „HashMap“ daugialypėje programoje be išorinės sinchronizacijos.
  • Galite sinchronizuoti „HashMap“ iš išorės naudojant „Kolekcijos“ sinchronizuoto žemėlapio () metodą.

2) Paveldėjo

  • Nors ir „HashMap“, ir „HashTable“ sąsajos įgyvendina žemėlapio sąsają, jos plečia dvi skirtingas klases.
  • HashMap praplečia AbstractMap klasę, kur, nes HashTable praplečia klasės žodyną, kuris yra paveldėta klasė java.

3) Nulinės vertės ir nulinės vertės

  • „HashMap“ leidžia maksimaliai naudoti vieną nulinį raktą ir bet kokį nulinės vertės skaičių.
  • Kur, kaip ir HashTable, neleidžia net vieno nulio ir nulinės vertės.

4) Aplink

  • „HashMap“ grąžina tik „Iterators“, naudojamus naršyti „HashMap“ elementuose.
  • „HashTable“ grąžina „Iterator“, taip pat skaičiavimą, kurį galima naudoti norint pereiti per „HashTable“ elementus.

5) „Fail-Fast Vs“ nepavyksta

  • „HashMap“ sugrąžintas iteratorius yra nesuderinamas su gamta, tai yra, jie išmeta „ConcurrentModificationException“, jei „HashMap“ pakeisite sukūrus „Iterator“, išskyrus iteratorių, savo pašalinimo () metodą.
  • Kita vertus, „HashTable“ sugrąžintas priskyrimas yra klaidingas tolerancijai gamtoje, tai yra, jie nekelia jokių išimčių, jei „HashTable“ pasikeičia po to, kai sukuria sąrašą.

6) Veikimas

  • Kadangi „HashTable“ yra sinchronizuota viduje, „HashTable“ yra šiek tiek lėčiau nei „HashMap“.

7) Legacy Class

  • HashTable yra paveldėta klasė.
  • Manoma, kad tai beveik nepriimtina.
  • Kadangi „JDK 1.5“, „ConcurrentHashMap“ yra geresnis pasirinkimas nei „HashTable“.

8) „Java“ pagrindų narys

  • „HashMap“ buvo „Java Collection Framework“ narys nuo pat jo įkūrimo JDK 1.2.
  • Bet HashTable buvo prieš JDK 1.2. JDK 1.2 buvo sukurtas, kad būtų įdiegta žemėlapio sąsaja, todėl ji tampa surinkimo struktūros dalimi.

2019

30 сент. atsakymas duotas Preya 30 Sep 2016-09-30 10:18 '16 at 10:18 pm 2016-09-30 10:18

Kelių sriegių taikomosioms programoms dažnai galite pasitraukti su „ConcurrentHashMap“ - priklausomai nuo jūsų našumo reikalavimų.

15
03 сент. Atsakymą pateikė Tim Howland 03 Sep. 2008-09-03 01:38 '08 at 1:38 2008-09-03 01:38

Collection kartais vadinama konteineriu, yra paprasčiausiai objektas, kuris suskirsto kelis elementus į vieną bloką. Collection naudojama kaupti, gauti, valdyti ir keistis bendrais duomenimis. W kolekcijos rėmas yra vienintelė kolekcijų atstovavimo ir valdymo struktūra.

HashMap JDK1.2 ir „Hashtable JDK1.0 abu naudojami atstovauti grupei objektų, atstovaujamų poroje <Key, Value> . Kiekviena <Key, Value> pora vadinama Entry objektu. Įrašų rinkinys reiškia HashMap ir Hashtable objektus. Rinkinyje esantys raktai turi būti unikalūs arba skiriamieji. [kadangi jie naudojami tam tikro rakto rodymo vertei gauti. vertės gali būti dubliuojamos.]


" Aukštesnės klasės narystė, paveldas ir kompiliacija

Hashtable yra paveldėta klasė, įvesta JDK1.0 , kuri yra žodyno subklasė. Nuo JDK1.2 Hashtable pertvarkomas, kad būtų įdiegta žemėlapio sąsaja, kad taptų surinkimo struktūros nariu. „HashMap“ yra „Java Collection Framework“ narys nuo pat jo įgyvendinimo pradžios JDK1.2 . HashMap yra AbstractMap poklasis.

collision “ atveju keli įrašai yra saugomi vienoje kibiroje, kurią reikia ieškoti nuosekliai.  Įkrovos koeficientas yra rodiklis, kaip galima gauti pilną maišos lentelę, kol ji automatiškai nepadidėja. 

HashMap sukuria tuščią maišos lentelę su pradine pradine apkrova (16) ir numatytuoju apkrovos koeficientu (0,75). Kur, kadangi Hashtable sukuria tuščią maišos lentelę su pradine pradine apkrova (11) ir apkrovos / užpildymo santykiu (0,75).

" Konstrukciniai pakeitimai, kai susiduria su maišais

HashMap , „ Hashtable , jei susiduria su maišais, jie saugo įrašus susietuose sąrašuose. Iš „Java8“ už „ HashMap jei maišos kaušas auga virš tam tikros ribos, šis kibiras persijungs iš linked list of entries to a balanced tree . kuris pagerina blogiausius rezultatus iš O (n) į O (log n). Konvertuojant sąrašą į dvejetainį medį, hashcode naudojamas kaip šakos kintamasis. Jei vienoje kibiroje yra du skirtingi maišos kodai, vienas laikomas dideliu ir nukreipiamas į dešinę nuo medžio ir kitas į kairę. Но когда оба хэш-кода равны, HashMap предполагает, что ключи сопоставимы, и сравнивает ключ, чтобы определить направление, чтобы можно было поддерживать некоторый порядок. Хорошая практика - сделать ключи от HashMap сопоставимыми . При добавлении записей, если размер ведра достигает TREEIFY_THRESHOLD = 8 конвертируйте связанный список записей в сбалансированное дерево, при удалении записей меньше TREEIFY_THRESHOLD и самое UNTREEIFY_THRESHOLD = 6 сбалансированное дерево в связанный список записей. Java 8 SRC , stackpost

" Инициация просмотра коллекции, Fail-Fast и Fail-Safe

Iterator является неустойчивым по своей природе.  t.y. он выбрасывает ConcurrentModificationException, если коллекция изменяется при повторении, кроме собственного метода remove(). Где, как Enumeration является отказоустойчивым по своей природе. Он не бросает никаких исключений, если коллекция изменяется во время итерации.