Kai išmoksti naują kompiuterio kalbą, vienas iš pirmųjų dalykų, kurių dažniausiai klausiate, yra tai, kaip dirbti su didelėmis duomenų grupėmis. Ši tema dažnai nagrinėjama tema „Duomenų struktūros“. Jei kasote giliau, tarp daugelio kitų duomenų struktūrų turite būti tokių temų kaip susieti sąrašai, eilės, krūvos ir dvejetainiai medžiai. „Java“ programoje šios struktūros yra „Java“ rinkinių sistemos dalis. Kolekcija yra ne kas kita, kaip duomenų struktūros rūšis, kuri nurodo kelių duomenų elementų grupavimą, o „Java“ rinkinių sistema standartizuoja šių objektų grupių tvarkymo būdą. Tiesą sakant, kolekcijų sistema buvo sukurta siekiant kelių tikslų.
Visa kolekcijų sistema sukurta atsižvelgiant į standartinių sąsajų rinkinį. Šias sąsajas, kurias galite naudoti, teikia keletas standartinių diegimų, tokių kaip „LinkedList“, „HashSet“ ir „TreeSet“. Be to, jei norite, galite įgyvendinti ir savo kolekciją. Tačiau, be kolekcijų, rėmuose yra apibrėžtos kelios žemėlapio sąsajos ir klasės. „Java“ yra trys bendrosios paskirties žemėlapių įgyvendinimai - „HashMap“, „TreeMap“ ir „LinkedHashMap“ - kuriuose saugomos raktų / reikšmių poros. Nors žemėlapiai nėra techniškai kolekcijos, jie yra visiškai integruoti su kolekcijomis. Tiesą sakant, žemėlapiai orientuojasi į objektų asociacijų grupes. Šiame straipsnyje apibendrinami pagrindiniai „HashMap“ ir „HashSet“ skirtumai.
„HashMap“ yra dažniausiai naudojamas žemėlapio sąsajos įgyvendinimas, pateikiantis pagrindinį rakto / vertės žemėlapį, kuriame elementai nėra tvarkomi. Jis naudoja specialią reikšmę, vadinamą maišos kodu, užuot lėta rakto paieška. Maišos kodas yra būdas paimti informaciją apie aptariamą objektą ir paversti jį „palyginti unikaliu“ to objekto int. Tai tiesiog veikia maišos principu, o tai reiškia, kad ji naudoja maišos funkciją identifikuojančioms vertėms nustatyti. Kaip „Vector“ ir „Stack“ pakeitimai yra „ArrayList“ ir „LinkedList“, „Hashtable“ turi pakeitimus „HashMap“. Jis išplečia „AbstractMap“, kad būtų įdiegta žemėlapio sąsaja naudojant vidinę „Hashtable“ atvaizdą. Kaip ir kiti bendrosios paskirties diegimai, „HashMap“ palaiko pasirenkamus žemėlapio metodus, leidžia naudoti nulines reikšmes ir nėra sinchronizuojamas.
„HashSet“ yra vienas iš „Java“ rinkinių sistemos, įgyvendinančios „Set“ sąsają, narių, paremtų maišos lentele, kuri iš tikrųjų yra „HashMap“ egzempliorius. Kaip rodo pavadinimas, jį įgyvendina maišos lentelė, masyvas, kuriame elementai yra laikomi toje vietoje, kuri gaunama iš jų turinio. Skirtingai nuo žemėlapio, rinkinys yra tiksliai kolekcija su lygiai tokia pati sąsaja, todėl nėra jokių papildomų funkcijų, kaip kad yra su dviem skirtingais sąrašais. „HashSet“ naudoja maišos funkciją, kuri yra sukurta specialiai greitam paieškai. Tai yra netvarkyta unikalių objektų kolekcija, kurioje negalima laikyti pasikartojančių verčių. „HashSet“ praplečia „AbstractSet“ klasę, kurioje įdiegiama „Set“ sąsaja. Tačiau „HashSet“ neapibrėžia jokių papildomų metodų, išskyrus tuos, kuriuos teikia jos superklasės ir sąsajos.
„HashMap“ yra dažniausiai naudojamas žemėlapio sąsajos įgyvendinimas, pateikiantis pagrindinį rakto / vertės žemėlapį, kuriame elementai nėra tvarkomi. Tai tiesiog veikia maišos principu, o tai reiškia, kad ji naudoja maišos funkciją identifikuojančioms vertėms nustatyti. Kita vertus, „HashSet“ yra vienas iš „Java“ rinkinių sistemos, įgyvendinančios „Set“ sąsają, narių, paremtų maišos lentele, kuri iš tikrųjų yra „HashMap“ egzempliorius. Paprasčiau tariant, „HashMap“ įgyvendina žemėlapio sąsają, o „HashSet“ - „Set“ sąsają.
„HashSet“ sukuria kolekciją, kurios saugojimui naudojama maišos lentelė. Hash lentelė saugo informaciją, naudodama metodą, vadinamą maišos. „HashSet“ naudoja maišos funkciją, kuri yra specialiai sukurta greitam paieškai, norint išsaugoti elementus ar reikšmes. Didžiąją „HashSet“ funkcionalumo dalį suteikia „AbstractCollection“ ir „AbstractSet“ superklasė, kuria „HashSet“ dalijasi su „TreeSet“. „HashMap“ išplečia „AbstractMap“, kad įgyvendintų žemėlapio sąsają, naudodamas vidinę „Hashtable“ reprezentaciją. Abi klasės nėra sinchronizuotos, todėl jos nėra tinkamos saugaus sriegio operacijoms.
Kadangi žemėlapis nepalaiko pasikartojančių raktų, „HashMap“ neleidžia kopijuoti raktų, tačiau leidžiama turėti pasikartojančias reikšmes. Tai reiškia, kad „HashMap“ gali egzistuoti pasikartojančios reikšmės, tačiau galite naudoti kolekciją kaip vertę prieš kurį nors raktą. Kiekvienas raktas turi būti unikalus „HashMap“ ir negalima leisti, kad vienas raktas turėtų daugiau nei 1 reikšmę. Kita vertus, „HashSet“ negali turėti pasikartojančių elementų vien apibrėždamas rinkinį, tai reiškia, kad negalite saugoti pasikartojančių reikšmių „HashSet“. „HashMap“ leidžia naudoti tik vieną nulinį raktą, tačiau leidžia bet kokį nulinių verčių skaičių, tuo tarpu „HashSet“ leidžia naudoti tik vieną nulinę reikšmę.
„HashMap“ veikia maišos principu, o tai reiškia, kad ji naudoja maišos funkciją, norėdama identifikuoti reikšmes viduje, naudodama maišos algoritmą, kad būtų galima lengvai juos atkurti. Tikras maišos mechanizmas visada grąžina tą patį maišos kodą (), kai jis pritaikomas tam pačiam objektui. Kita vertus, „HashSet“ naudoja „HashMap“ kaip atsarginę duomenų struktūrą objektams pridėti ar saugoti. Tai reiškia, kad kai bus sukurtas HashSet objektas, jis sukurs HashMap objektą.
Nors „HashMap“ ir „HashSet“ nėra sinchronizuoti, tai reiškia, kad jie nėra tinkami saugaus sriegio operacijoms ir yra visiškai skirtingos konstrukcijos, tačiau jie teikia nuolatinį pagrindinių operacijų, tokių kaip elemento pridėjimas, pašalinimas ir pan., Našumą. Nors „HashMap“ yra bendrosios paskirties Žemėlapio sąsaja, kurioje saugomos raktų / reikšmių poros, „HashSet“ yra „Set“ sąsajos įgyvendinimas. „HashSet“ naudoja „HashMap“, kad sukurtų palaikymą. Tačiau „HashMap“ naudoja maišos principą ir jį naudoja greitai medžiodami raktą.