Ko se naučite novega računalniškega jezika, je ena prvih vprašanj, ki si jih zastavljate, kako delati z velikimi skupinami podatkov. Ta tema je pogosto zajeta v temi "Strukture podatkov". Če kopate globlje, morate obiskati teme, kot so povezani seznami, čakalne vrste, skladbe in binarna drevesa med številnimi drugimi podatkovnimi strukturami. Na Javi so te strukture del okvira Java Collection Collection. Zbirka ni nič drugega kot vrsta podatkovne strukture, ki se nanaša na združevanje več podatkovnih elementov in okvir Java Collections Framework standardizira način ravnanja s temi skupinami predmetov. Pravzaprav je bil okvir zbirk zasnovan tako, da je dosegel več ciljev.
Celoten okvir zbirk je zasnovan na podlagi niza standardnih vmesnikov. Ti vmesniki ponujajo več standardnih izvedb, kot so LinkedList, HashSet in TreeSet, ki jih lahko uporabljate. Poleg tega lahko po lastni izbiri implementirate tudi svojo zbirko. Vendar okvir poleg zbirk določa več vmesnikov in razredov zemljevidov. Java vsebuje tri izvedbe zemljevidov splošnega pomena - HashMap, TreeMap in LinkedHashMap - ki shranjujejo pare ključ / vrednost. Čeprav zemljevidi tehnično niso zbirke, so v celoti združeni z zbirkami. V resnici se zemljevidi osredotočajo na skupine povezovanja med predmeti. Ta članek povzema ključne razlike med HashMapom in HashSetom.
HashMap je najpogosteje uporabljena vmesnik Map, ki zagotavlja osnovni zemljevid ključ / vrednost, pri katerem elementi niso urejeni. Namesto počasnega iskanja ključa uporablja posebno vrednost, imenovano hash kodo. Hash-koda je način, kako v zadevni objekt vzeti informacije in jih spremeniti v "razmeroma edinstveno" int za ta objekt. Preprosto deluje na principu mešanja, kar pomeni, da uporablja hash funkcijo za preslikavo identifikacijskih vrednosti. Tako kot imata Vector in Stack svoje nadomestke v ArrayList in LinkedList, ima tudi Hashtable zamenjavo v HashMap-u. Razširja AbstractMap za implementacijo vmesnika Map z uporabo notranjega predstavitve Hashtable. Podobno kot druge izvedbe za splošne namene, tudi HashMap podpira izbirne metode Map, omogoča ničelne vrednosti in ni sinhroniziran.
HashSet je eden izmed članov zbirke Java Collections, ki izvaja vmesnik Set, podprt s tabelo hash, ki je v resnici primer HashMap. Kot pove že ime, ga izvaja hash tabela, matrika, v kateri so elementi shranjeni na položaju, pridobljenem iz njihove vsebine. Za razliko od Zemljevida je Set natančno zbirka s popolnoma enakim vmesnikom, tako da ni dodatnih funkcij, kot je z dvema različnima seznama. HashSet uporablja funkcijo mešanja, ki je zasnovana posebej za hitre iskanje. Gre za neurejeno zbirko edinstvenih predmetov, ki ne more shraniti podvojenih vrednosti. HashSet razširja razred AbstractSet, ki izvaja vmesnik Set. Vendar HashSet ne določa nobenih dodatnih metod, razen tistih, ki jih zagotavljajo nadklase in vmesniki.
HashMap je najpogosteje uporabljena vmesnik Map, ki zagotavlja osnovni zemljevid ključ / vrednost, pri katerem elementi niso urejeni. Preprosto deluje na principu mešanja, kar pomeni, da uporablja hash funkcijo za preslikavo identifikacijskih vrednosti. HashSet je na drugi strani eden izmed članov zbirke Java Collections, ki izvaja vmesnik Set, podprt s tabelo hash, ki je v resnici primer HashMap. Preprosto rečeno, HashMap izvaja vmesnik Map, medtem ko HashSet izvaja vmesnik Set.
HashSet ustvari zbirko, ki za shranjevanje uporablja hash tabelo. Hash tabela shranjuje informacije z metodo, imenovano hashing. HashSet za shranjevanje elementov ali vrednosti uporablja funkcijo mešanja, ki je posebej zasnovana za hitro iskanje. Večino funkcionalnosti HashSet zagotavlja prek superklasa AbstractCollection in AbstractSet, ki ga HashSet deli s TreeSetom. HashMap razširja AbstractMap za implementacijo vmesnika Map z uporabo notranjega predstavitve Hashtable. Oba razreda nista sinhronizirana, kar pomeni, da nista primerna za varne navoje.
Ker Map ne podpira podvojenih ključev, HashMap ne dovoljuje podvojenih ključev, dovoljeno pa je, da imajo podvojene vrednosti. To pomeni, da v HashMap-u lahko obstajajo podvojene vrednosti, vendar lahko zbirko uporabite kot vrednost proti nekemu ključu. Vsak ključ mora biti edinstven v HashMap-u, pri enem ključu pa ne sme biti več kot 1 vrednost. HashSet, po drugi strani, ne more imeti podvojenih elementov s samo definicijo nabora, kar pomeni, da ne morete shraniti podvojenih vrednosti v HashSet. HashMap dovoljuje le eno ničelno tipko, vendar dovoljuje poljubno število ničelnih vrednosti, medtem ko HashSet omogoča le eno ničelno vrednost.
HashMap deluje na principu mešanja, kar pomeni, da uporablja hash funkcijo za interno preslikavanje identifikacijskih vrednosti z algoritmom hashinga, ki omogoča enostavno iskanje. Pravi mehanizem mešanja vedno vrne isti hashCode (), kadar ga uporabimo za isti objekt. Po drugi strani pa HashSet notranje uporablja HashMap kot podporno strukturo podatkov za dodajanje ali shranjevanje predmetov. To pomeni, ko bo ustvarjen objekt HashSet, bo ustvaril objekt HashMap.
Čeprav tako HashMap kot HashSet nista sinhronizirana, kar pomeni, da nista primerna za varne navoje in sta popolnoma različni konstrukti, zagotavljata stalno časovno zmogljivost za osnovne operacije, kot so dodajanje, odstranjevanje elementa itd. Medtem ko je HashMap splošno izvajanje Vmesnik Map, ki shranjuje pare ključ / vrednost, je HashSet izvedba vmesnika Set. HashSet za podporo izvajanja uporablja HashMap. Vendar pa HashMap uporablja princip hašišanja in ga uporablja za hitro iskanje ključa.