Apgūstot jaunu datora valodu, viena no pirmajām lietām, ko mēdzat jautāt, ir tas, kā strādāt ar lielām datu grupām. Šī tēma bieži tiek apskatīta tēmā “Datu struktūras”. Ja jūs rakt dziļāk, starp daudzām citām datu struktūrām jums ir jāaptver tādas tēmas kā saistītie saraksti, rindas, skursteņi un binārie koki. Java valodā šīs struktūras ir daļa no Java kolekciju ietvara. Kolekcija ir nekas cits kā datu struktūras tips, kas attiecas uz vairāku datu elementu grupēšanu, un Java kolekciju satvars standartizē šo objektu grupu apstrādes veidu. Faktiski kolekciju ietvars tika izveidots vairāku mērķu sasniegšanai.
Viss kolekciju ietvars ir veidots, izmantojot standarta saskarņu kopu. Šīs saskarnes nodrošina vairākas standarta ieviešanas, piemēram, LinkedList, HashSet un TreeSet, kuras jūs, iespējams, esat. Turklāt, ja vēlaties, varat arī ieviest savu kolekciju. Tomēr papildus kolekcijām ietvarstruktūra definē vairākas kartes saskarnes un klases. Java satur trīs vispārējas nozīmes karšu ieviešanu - HashMap, TreeMap un LinkedHashMap -, kurās glabājas atslēgu / vērtību pāri. Lai arī kartes tehniski nav kolekcijas, tās ir pilnībā integrētas kolekcijās. Faktiski kartes koncentrējas uz objektu asociācijas grupām. Šajā rakstā ir apkopotas galvenās atšķirības starp HashMap un HashSet.
HashMap ir visbiežāk izmantotā kartes saskarnes ieviešana, kas nodrošina pamata atslēgu / vērtību karti, kur elementi nav sakārtoti. Lēnas atslēgas meklēšanas vietā tā izmanto īpašu vērtību, ko sauc par hash kodu. Sajaukšanās kods ir veids, kā iegūt informāciju par attiecīgo objektu un pārvērst to par “relatīvi unikālu” šī objekta int. Tas vienkārši darbojas pēc sajaukšanas principa, kas nozīmē, ka identifikācijas vērtību kartēšanai tiek izmantota hash funkcija. Tāpat kā Vector un Stack ir aizvietotāji ArrayList un LinkedList, arī Hashtable ir HashMap nomaiņa. Tas paplašina AbstractMap, lai ieviestu kartes saskarni, izmantojot iekšēju Hashtable attēlojumu. Un līdzīgi kā citi vispārējas nozīmes implementācijas, arī HashMap atbalsta kartes izvēles metodes, pieļauj nulles vērtības un nav sinhronizēts.
HashSet ir viens no Java kolekciju ietvarstruktūras dalībniekiem, kas ievieš Set interfeisu, kuru atbalsta hash tabula, kas faktiski ir HashMap instance. Kā norāda nosaukums, to īsteno ar hash tabulu - masīvu, kurā elementi tiek glabāti vietā, kas atvasināta no to satura. Atšķirībā no kartes, komplekts ir tieši kolekcija ar tieši tādu pašu saskarni, tāpēc nav nekādas papildu funkcijas, kā tas ir ar diviem dažādiem sarakstiem. HashSet izmanto jaukšanas funkciju, kas ir īpaši paredzēta ātrai meklēšanai. Tā ir nesakārtota unikālu objektu kolekcija, kurā nevar saglabāt dublētās vērtības. HashSet paplašina AbstractSet klasi, kas ievieš Set interfeisu. Tomēr HashSet nenosaka nekādas papildu metodes, izņemot tās, kuras nodrošina tās superklases un saskarnes.
HashMap ir visbiežāk izmantotā kartes saskarnes ieviešana, kas nodrošina pamata atslēgu / vērtību karti, kur elementi nav sakārtoti. Tas vienkārši darbojas pēc sajaukšanas principa, kas nozīmē, ka identifikācijas vērtību kartēšanai tiek izmantota hash funkcija. HashSet, no otras puses, ir viens no Java kolekciju ietvarstruktūras dalībniekiem, kas ievieš Set saskarni, kuru atbalsta hash tabula, kas faktiski ir HashMap instance. Vienkārši runājot, HashMap ievieš kartes saskarni, turpretī HashSet ievieš saskarni Set.
HashSet izveido kolekciju, kuras glabāšanai tiek izmantots hash tabula. Hash tabula glabā informāciju, izmantojot metodi, ko sauc par jaukšanu. Elementi vai vērtības HashSet izmanto sajaukšanas funkciju, kas ir īpaši paredzēta ātrai meklēšanai. Lielākā HashSet funkcionalitāte tiek nodrošināta, izmantojot AbstractCollection un AbstractSet superklases, kuras HashSet dala ar TreeSet. HashMap paplašina AbstractMap, lai ieviestu kartes saskarni, izmantojot iekšēju Hashtable attēlojumu. Abas klases nav sinhronizētas, tas nozīmē, ka tās nav piemērotas drošai vītnei paredzētām darbībām.
Tā kā karte neatbalsta dublējošus taustiņus, HashMap neatļauj dublēt atslēgas, bet ir atļauts izmantot dublētās vērtības. Tas nozīmē, ka HashMap var pastāvēt vērtību dublikāti, bet jūs varat izmantot kolekciju kā vērtību kādai atslēgai. Katrai atslēgai jābūt unikālai HashMap un vienai atslēgai nedrīkst būt vairāk par 1 vērtību. HashSet, no otras puses, nevar būt dublējoši elementi, vienkārši definējot kopu, kas nozīmē, ka HashSet nevar saglabāt dublētās vērtības. HashMap atļauj tikai vienu nulles atslēgu, bet pieļauj jebkuru nulles vērtību skaitu, turpretī HashSet atļauj tikai vienu nulles vērtību.
HashMap darbojas pēc sajaukšanas principa, kas nozīmē, ka tā izmanto hash funkciju, lai iekšēji identificētu vērtības, izmantojot sajaukšanas algoritmu, lai nodrošinātu ērtu izguvi. Patiess sajaukšanas mehānisms vienmēr atgriež to pašu hashCode (), ja to piemēro vienam un tam pašam objektam. Savukārt HashSet iekšēji izmanto HashMap kā datu bāzes struktūru, lai pievienotu vai saglabātu objektus. Tas nozīmē, kad tiek izveidots HashSet objekts, tas izveidos HashMap objektu.
Lai gan gan HashMap, gan HashSet nav sinhronizēti, tas nozīmē, ka tie nav piemēroti drošām vītnēm un tie ir pilnīgi atšķirīgas konstrukcijas, tomēr tie nodrošina pastāvīgu laika veiktspēju pamata operācijām, piemēram, elementu pievienošanai, noņemšanai utt. Kaut arī HashMap ir universāla kartes saskarne, kurā tiek glabāti atslēgu / vērtību pāri, HashSet ir Set interfeisa ieviešana. HashSet izmanto HashMap, lai atbalstītu tās ieviešanu. Tomēr HashMap izmanto jaukšanas principu un izmanto to, lai ātri meklētu atslēgu.