Kun opit uuden tietokonekielen, yksi ensimmäisistä asioista, joita yleensä kysyt, on kuinka työskennellä suurten tietoryhmien kanssa. Tätä aihetta käsitellään usein aiheesta ”Tietorakenteet”. Jos kaivaa syvemmälle, sinun on kerättävä aiheita, kuten linkitettyjä luetteloita, jonoja, pinoja ja binaaripuita, monien muiden tietorakenteiden joukossa. Java-ohjelmassa nämä rakenteet ovat osa Java-kokoelmakehystä. Kokoelma ei ole muuta kuin tietyn tyyppinen tietorakenne, joka viittaa useiden dataelementtien ryhmittelyyn, ja Java-kokoelmakehys standardoi näiden objektoryhmien käsittelytavan. Itse asiassa kokoelmien kehys suunniteltiin vastaamaan useita tavoitteita.
Koko kokoelmakehys on suunniteltu vakiorajapintojen ympärille. Useat vakiototeutukset, kuten LinkedList, HashSet ja TreeSet, tarjoavat näitä käyttöliittymiä, joita voit nykyisin. Lisäksi voit myös toteuttaa oman kokoelmasi, jos valitset. Kokoelmien lisäksi puitteet määrittelevät useita karttarajapintoja ja luokkia. Java sisältää kolme yleiskäyttöistä kartta-toteutusta - HashMap, TreeMap ja LinkedHashMap -, jotka tallentavat avain / arvo-parit. Vaikka kartat eivät ole teknisesti kokoelmia, ne ovat täysin integroitu kokoelmiin. Itse asiassa kartat keskittyvät objektien välisiin assosiaatioryhmiin. Tässä artikkelissa on yhteenveto HashMapin ja HashSetin tärkeimmistä eroista.
HashMap on yleisimmin käytetty Map-käyttöliittymä, joka tarjoaa perus-avain- / arvokartan, jossa elementit ovat järjestyksessä. Se käyttää erityistä arvoa, nimeltään hash-koodia, avaimen hitaan haun sijaan. Hajautuskoodi on tapa ottaa tietoja kyseessä olevasta objektista ja muuttaa siitä kyseisen objektin ”suhteellisen ainutlaatuinen” int. Se toimii yksinkertaisesti hajautusperiaatteella, mikä tarkoittaa, että se käyttää hash-toimintoa tunnistaakseen arvot. Aivan kuten Vectorilla ja Stackilla on korvikkeet ArrayListissä ja LinkedListissä, Hashtablella on korvaus HashMapissa. Se laajentaa AbstractMap-sovelluksen toteuttamaan Kartta-käyttöliittymän käyttämällä sisäistä Hashtable-esitystä. Ja kuten muutkin yleiskäyttöiset toteutukset, HashMap tukee valinnaisia Map-menetelmiä, sallii nolla-arvot eikä sitä synkronoida.
HashSet on yksi Java-kokoelmakehyksen jäsenistä, joka toteuttaa Set-rajapinnan, jota tukee hash-taulukko, joka on itse asiassa HashMap-ilmentymä. Kuten nimestä voi päätellä, se toteutetaan hash-taulukolla, taulukolla, johon elementit tallennetaan niiden sisällöstä johdettuun sijaintiin. Toisin kuin kartta, Set on täsmälleen kokoelma, jolla on täsmälleen sama käyttöliittymä, joten siinä ei ole ylimääräisiä toimintoja, kuten kahdella eri listalla. HashSet käyttää hajautustoimintoa, joka on suunniteltu erityisesti nopeita hakuja varten. Se on järjestämätön kokoelma ainutlaatuisia objekteja, joihin ei voida tallentaa päällekkäisiä arvoja. HashSet laajentaa AbstractSet-luokkaa, joka toteuttaa Set-rajapinnan. HashSet ei kuitenkaan määrittele muita lisämenetelmiä kuin superluokkien ja rajapintojen tarjoamat menetelmät.
HashMap on yleisimmin käytetty Map-käyttöliittymä, joka tarjoaa perus-avain- / arvokartan, jossa elementit ovat järjestyksessä. Se toimii yksinkertaisesti hajautusperiaatteella, mikä tarkoittaa, että se käyttää hash-toimintoa tunnistaakseen arvot. HashSet puolestaan on yksi Java-kokoelmakehyksen jäsenistä, joka toteuttaa Set-rajapinnan, jota tukee hash-taulukko, joka on itse asiassa HashMap-ilmentymä. Yksinkertaisesti sanottuna HashMap toteuttaa Kartta-käyttöliittymän, kun taas HashSet toteuttaa Aseta-käyttöliittymän.
HashSet luo kokoelman, joka käyttää hash-taulukkoa tallennukseen. Hash-taulukko tallentaa tietoja käyttämällä hajautusmenetelmää. HashSet käyttää hajautustoimintoa, joka on erityisesti suunniteltu nopeaan hakuun, elementtien tai arvojen tallentamiseksi. Suurin osa HashSet-toiminnoista tarjotaan AbstractCollection- ja AbstractSet-yliluokan kautta, jonka HashSet jakaa TreeSetin kanssa. HashMap laajentaa AbstractMap-sovelluksen toteuttamaan Kartta-käyttöliittymän käyttämällä sisäistä Hashtable-esitystä. Molemmat luokat eivät ole synkronoituja, joten ne eivät sovellu langaturvallisiin toimintoihin.
Koska Kartta ei tue päällekkäisiä avaimia, HashMap ei salli kaksoiskappaleiden kopiointia, mutta sillä saa olla kopioitavia arvoja. Tämä tarkoittaa, että HashMapissa voi olla kopioitavia arvoja, mutta voit käyttää kokoelmaa arvona jotain avainta vastaan. Jokaisen avaimen on oltava ainutlaatuinen HashMapissa, ja yhdellä avaimella ei saa olla enemmän kuin yksi arvo. Toisaalta HashSetillä ei voi olla päällekkäisiä elementtejä pelkällä joukon määrittelyllä, mikä tarkoittaa, että et voi tallentaa päällekkäisiä arvoja HashSetissä. HashMap sallii vain yhden nolla-avaimen, mutta sallii minkä tahansa määrän nollia arvoja, kun taas HashSet sallii vain yhden nolla-arvon.
HashMap toimii hajautusperiaatteella, mikä tarkoittaa, että se käyttää hash-toimintoa tunnistaakseen arvot sisäisesti hajautusalgoritmin avulla helpon hakemisen mahdollistamiseksi. Todellinen hajautusmekanismi palauttaa aina saman hashCode () -sovelluksen, kun sitä käytetään samaan objektiin. HashSet puolestaan käyttää sisäisesti HashMapia taustatietorakenteena objektien lisäämiseen tai tallentamiseen. Tämä tarkoittaa, että kun HashSet-objekti luodaan, se luo HashMap-objektin.
Vaikka sekä HashMap että HashSet eivät ole synkronoituja, ne eivät sovellu langaturvallisiin toimintoihin ja ne ovat täysin erilaisia rakenteita, mutta ne tarjoavat jatkuvan suorituskyvyn perustoiminnoille, kuten elementin lisääminen, poistaminen jne. Vaikka HashMap on yleiskäyttöinen Karttarajapinta, joka tallentaa avain / arvo-parit, HashSet on Set-käyttöliittymän toteutus. HashSet käyttää HashMap-ohjelmaa tukemaan sen toteutusta. HashMap kuitenkin käyttää hajautusperiaatetta ja käyttää sitä nopeasti avaimen etsimiseen.