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 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 nav 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 varat atrast. 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.

Kas ir HashMap?

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 attiecīgajā objektā un pārvērst to par “salīdzinoši 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 netiek sinhronizēta.

Kas ir HashSet?

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 tai nav nekādu papildu funkciju, 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.

Atšķirība starp HashMap un HashSet

  1. Pamata

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.

  1. Funkcionalitāte

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ā daļa HashSet funkcionalitātes 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.

  1. Dublikātu vērtības

Tā kā karte neatbalsta dublējošus taustiņus, HashMap neatļauj dublēt atslēgas, taču 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.

  1. Uzglabāšanas mehānisms

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.

HashMap pret HashSet: salīdzināšanas diagramma

Kopsavilkums par HashMap Vs. HashSet

Kaut arī 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 darbību pamata operācijām, piemēram, elementa 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.

Atsauces

  • Žukovskis, Jānis. Java kolekcijas. Ņujorka: Apress, 2008. Drukāt
  • Ekls, Brūss. Domā Java. Ņūdžersija: Prentice Hall, 2003. Drukāt
  • Naftalins, Maurīcija un Filips Vādlers. Java Generics un kolekcijas. Sebastopole, Kalifornija: O'Reilly Media, 2006. Drukāt
  • Attēla kredīts: https://upload.wikimedia.org/wikipedia/commons/3/3b/Java_collection_set_implementations.jpg
  • Attēla kredīts: https://en.wikipedia.org/wiki/Java_collections_framework#/media/File:Java.util.Map_hierarchy.svg