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. Kogumik on midagi muud kui andmestruktuur, 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 kaardirakendust - 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.
HashMap on kaardiliidese kõige sagedamini kasutatav teostus, mis pakub põhivõtit / väärtuskaarti, kus elemendid on järjestamata. See kasutab võtme aeglase otsimise asemel spetsiaalset väärtust, mida nimetatakse räsi koodiks. Räsikood on viis, kuidas võtta vaadeldavas objektis 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 Mapi valikulisi meetodeid, lubab nullväärtusi ja pole sünkroonitud.
HashSet on üks Java Collection Framework liikmetest, mis rakendab liidest Set, mida toetab räsitabel, mis on tegelikult HashMap näiteks. Nagu nimest järeldada võib, rakendab seda räsitabel - massiiv, 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, mis on ette nähtud selle superklassides ja liidestes.
HashMap on kaardiliidese kõige sagedamini kasutatav teostus, mis pakub põhivõtit / väärtuskaarti, kus elemendid on järjestamata. 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.
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 AbstractMapi, et rakendada kaardiliidest sisemise hashtable esituse abil. Mõlemad klassid pole sünkroniseeritud, st nad ei sobi keermekindlaks tööks.
Kuna Map ei toeta dubleerivaid võtmeid, ei luba HashMap dubleerivaid võtmeid, kuid lubatakse, et neil on dubleerivaid väärtusi. See tähendab, et HashMapis võivad eksisteerida duplikaatväärtused, kuid väärtust saab mõne võtme vastu kasutada kogumisena. 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.
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 hashCode (). HashSet seevastu kasutab sisemiselt HashMapit tugistruktuurina objektide lisamiseks või salvestamiseks. See tähendab, et kui HashSeti objekt luuakse, loob see HashMapi objekti.
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 üldotstarbeline kaardiliides, mis salvestab võtme- / väärtusepaare, HashSet on komplekti Set rakendus. HashSet kasutab selle rakendamiseks HashMap-i. HashMap kasutab aga räsimise põhimõtet ja kasutab seda võtme kiireks kütmiseks.