Uue arvutikeele õppimisel on üks esimesi asju, mida tavaliselt küsitakse, kuidas töötada suurte andmegruppidega. Seda teemat käsitletakse sageli teema “Andmestruktuurid” all. Kui kaevata sügavamale, peate paljude muude andmestruktuuride hulgas leiduma selliseid teemasid nagu lingitud loendid, järjekorrad, virnad ja binaarsed puud. Java-s on need struktuurid osa Java Collection Frameworkist. Kogumine pole midagi muud kui andmestruktuuri tüüp, mis viitab mitme andmeelemendi rühmitamisele ja Java Collection Framework standardiseerib nende objektide rühmade käsitlemise viisi. Tegelikult loodi kollektsioonide raamistik mitme eesmärgi saavutamiseks.

Kogu kollektsioonide raamistik on kujundatud standardsete liideste komplekti ümber. Nende liideste kaudu pakutakse mitut standardset teostust, näiteks LinkedList, HashSet ja TreeSet, mida võite praegusel kujul kasutada. Lisaks saate soovi korral ka oma kollektsiooni rakendada. Kuid lisaks kogudele määratleb raamistik ka mitmed kaardiliidesed ja klassid. Java sisaldab kolme üldotstarbelist kaarditeostust - HashMap, TreeMap ja LinkedHashMap -, mis salvestavad võtme- / väärtuspaare. Ehkki kaardid ei ole tehniliselt kogud, on need kogudega täielikult integreeritud. Tegelikult keskenduvad kaardid objektide vahelistele assotsiatsioonirühmadele. See artikkel võtab kokku peamised erinevused HashMapi ja HashSeti vahel.

Mis on HashMap?

HashMap on kõige sagedamini kasutatav kaardiliidese rakendus, mis pakub põhivõtit / väärtuste kaarti, kus elemendid on korrastamata. See kasutab võtme aeglase otsimise asemel spetsiaalset väärtust, mida nimetatakse räsi koodiks. Räsikood on viis, kuidas võtta vaadeldavast objektist teavet ja muuta see selle objekti jaoks suhteliselt ainulaadseks. See töötab lihtsalt räsimisprintsiibil, mis tähendab, et ta kasutab väärtuste tuvastamiseks räsifunktsiooni. Nii nagu Vectoril ja Stackil on asendajad ArrayList ja LinkedList, on ka Hashtablel HashMap. See laiendab AbstractMapi, et rakendada kaardiliides sisemise hashtable esituse abil. Ja sarnaselt muudele üldotstarbelistele rakendustele toetab HashMap kaardi valikulisi meetodeid, lubab nullväärtusi ja pole sünkroonitud.

Mis on HashSet?

HashSet on üks Java Collection Frameworki liikmeid, mis rakendab liidest Set, mida toetab räsitabel, mis on tegelikult HashMap näiteks. Nagu nimest järeldada võib, rakendatakse seda räsitabeli abil - massiivi, milles elemente hoitakse nende sisust tuletatud asukohas. Erinevalt kaardist on komplekt täpselt sama liidesega Kogumik, nii et seal pole täiendavaid funktsioone, nagu kahe erineva loendi puhul. HashSet kasutab räsimisfunktsiooni, mis on loodud spetsiaalselt kiireteks otsinguteks. See on unikaalsete objektide järjestamata kogum, mida ei saa dubleerida. HashSet laiendab AbstractSet klassi, mis viib sisse liidese Set. HashSet ei määratle aga muid täiendavaid meetodeid peale nende, mida pakuvad selle superklassid ja liidesed.

Erinevus HashMapi ja HashSeti vahel

  1. Põhiline

HashMap on kõige sagedamini kasutatav kaardiliidese rakendus, mis pakub põhivõtit / väärtuste kaarti, kus elemendid on korrastamata. See töötab lihtsalt räsimisprintsiibil, mis tähendab, et ta kasutab väärtuste tuvastamiseks räsifunktsiooni. HashSet on seevastu üks Java Collection Frameworki liikmeid, mis rakendab liidest Set, mida toetab räsitabel, mis on tegelikult HashMap näiteks. Lihtsamalt öeldes rakendab HashMap kaardi liidest, samal ajal kui HashSet rakendab liidest Set.

  1. Funktsionaalsus

HashSet loob kollektsiooni, mille hoidmiseks kasutatakse räsitabelit. Hash-tabel salvestab teabe, kasutades meetodit, mida nimetatakse räsimiseks. HashSet kasutab elementide või väärtuste salvestamiseks räsimisfunktsiooni, mis on spetsiaalselt loodud kiireteks otsinguteks. Suurem osa HashSeti funktsionaalsusest on tagatud suveklassi AbstractCollection ja AbstractSet kaudu, mida HashSet jagab TreeSetiga. HashMap laiendab AbstractMapit, et rakendada kaardiliidest sisemise hashtable esituse abil. Mõlemad klassid pole sünkroniseeritud, st nad ei sobi keermekindlaks tööks.

  1. Kordusväärtused

Kuna Map ei toeta dubleerivaid võtmeid, ei luba HashMap dubleerivaid võtmeid, kuid lubada, et neil on dubleerivaid väärtusi. See tähendab, et HashMapis võivad eksisteerida duplikaatväärtused, kuid võite väärtust kogumi kasutada mõne võtme korral. Iga võti peab HashMapis olema unikaalne ja ühel võtmel ei tohi olla rohkem kui 1 väärtus. Teisest küljest ei saa HashSet omada dubleerivaid elemente lihtsalt komplekti määratluse abil, mis tähendab, et te ei saa dubleerivaid väärtusi HashSetis talletada. HashMap lubab ainult ühte nullvõtit, kuid lubab suvalist arvu nullväärtusi, samas kui HashSet lubab ainult ühte nullväärtust.

  1. Salvestusmehhanism

HashMap töötab räsimisprintsiibil, mis tähendab, et ta kasutab räsifunktsiooni, et kaardistada sisemiselt tuvastatavad väärtused räsimisalgoritmi abil, et võimaldada hõlpsat otsimist. Tõeline räsimehhanism tagastab sama objekti puhul alati sama räsikoodi (). Seevastu HashSet kasutab sisemiselt HashMapit tugistruktuurina objektide lisamiseks või salvestamiseks. See tähendab, et kui HashSeti objekt luuakse, loob see HashMapi objekti.

HashMap vs HashSet: võrdlusdiagramm

HashMap Vs kokkuvõte HashSet

Ehkki nii HashMap kui ka HashSet pole sünkroonitud, ei sobi need niiditurvalisteks toiminguteks ja need on täiesti erinevad konstruktsioonid, kuid need pakuvad põhitoimingute jaoks nagu elemendi lisamine, eemaldamine jne pidevat toimivust aja jooksul. HashMap on aga üldotstarbeline kaardiliides, mis salvestab võtme- / väärtuspaare, HashSet on komplekti Set juurutamine. HashSet kasutab selle rakendamiseks HashMap-i. HashMap kasutab aga räsimise põhimõtet ja kasutab seda võtme kiireks kütmiseks.

Viited

  • Zukowski, John. Java kogud. New York City: Apress, 2008. Trükk
  • Eckel, Bruce. Mõeldes Java keeles. New Jersey: Prentice Hall, 2003. Trükk
  • Naftalin, Maurice ja Philip Wadler. Java Generics ja kogud. Sebastopol, California: O'Reilly Media, 2006. Trükk
  • Kujutise krediit: https://upload.wikimedia.org/wikipedia/commons/3/3b/Java_collection_set_implementations.jpg
  • Kujutise krediit: https://en.wikipedia.org/wiki/Java_collections_framework#/media/File:Java.util.Map_hierarchy.svg