Når du lærer et nyt computersprog, er en af de første ting, du ofte spørger, hvordan du arbejder med store grupper af data. Dette emne dækkes ofte under emnet "Datakonstruktioner". Hvis du graver dybere, skal du komme rundt om emner som tilknyttede lister, køer, stabler og binære træer blandt mange andre datastrukturer. I Java er disse strukturer en del af Java Collections Framework. En samling er intet andet end en type datastruktur, der henviser til en gruppering af flere dataelementer og Java Collections Framework standardiserer den måde, hvorpå disse grupper af objekter håndteres. Faktisk var samlingerne rammer designet til at opfylde flere mål.
Hele samlingens rammer er designet omkring et sæt standardgrænseflader. Flere standardimplementeringer såsom LinkedList, HashSet og TreeSet leveres af disse grænseflader, som du kan være som den er. Derudover kan du også implementere din egen samling, hvis du vælger det. Ud over samlinger definerer rammen imidlertid flere kortgrænseflader og klasser. Java indeholder tre kortimplementeringer til generelle formål - HashMap, TreeMap og LinkedHashMap - som gemmer nøgle / værdipar. Selvom kort ikke teknisk er samlinger, er de fuldt integreret med samlinger. Faktisk fokuserer kort på grupper af tilknytning mellem objekter. Denne artikel opsummerer de vigtigste forskelle mellem HashMap og HashSet.
HashMap er den mest anvendte implementering af Map-grænsefladen, der giver et grundlæggende nøgle- / værdikort, hvor elementerne ikke er sorteret. Den bruger en speciel værdi kaldet en hash-kode i stedet for en langsom søgning af nøglen. Hash-koden er en måde at tage information om det pågældende objekt på og omdanne den til et "relativt unikt" int for det objekt. Det fungerer simpelthen på hashprincippet, hvilket betyder, at det bruger en hash-funktion til at kortlægge identificerende værdier. Ligesom Vector og Stack har deres erstatninger i ArrayList og LinkedList, har Hashtable en erstatning i HashMap. Det udvider AbstractMap til at implementere Map-interface ved hjælp af en intern Hashtable-repræsentation. Og ligner andre generelle implementeringer, understøtter HashMap de valgfri metoder til kort, tillader nul-værdier og er ikke synkroniseret.
HashSet er et af medlemmerne af Java Collections Framework, der implementerer Set-grænsefladen, bakket op af en hash-tabel, der faktisk er en HashMap-instans. Som navnet antyder, implementeres det ved en hash-tabel, en matrix, hvor elementer gemmes i en position, der er afledt af deres indhold. I modsætning til et kort er Set nøjagtigt en samling med nøjagtigt den samme interface, så der er ikke nogen ekstra funktionalitet, som der er med to forskellige lister. HashSet bruger en hashing-funktion, der er designet specifikt til hurtige opslag. Det er en uordnet samling af unikke objekter, der ikke kan gemme duplikatværdier. HashSet udvider AbstractSet-klassen, der implementerer Set-interface. HashSet definerer dog ikke andre yderligere metoder end dem, der leveres af dens superklasser og grænseflader.
HashMap er den mest anvendte implementering af Map-grænsefladen, der giver et grundlæggende nøgle- / værdikort, hvor elementerne ikke er sorteret. Det fungerer simpelthen på hashprincippet, hvilket betyder, at det bruger en hash-funktion til at kortlægge identificerende værdier. HashSet er på den anden side et af medlemmerne af Java Collections Framework, der implementerer Set-grænsefladen, bakket op af en hash-tabel, der faktisk er en HashMap-instans. Simpelt set implementerer HashMap Map-grænsefladen, mens HashSet implementerer Set-interface.
HashSet opretter en samling, der bruger en hash-tabel til opbevaring. Hash-tabel gemmer information ved hjælp af en metode kaldet hashing. HashSet bruger en hashing-funktion, der er specifikt designet til hurtige opslag, til at gemme elementer eller værdier. Det meste af HashSet-funktionaliteten leveres gennem superklassen AbstractCollection og AbstractSet, som HashSet deler med TreeSet. HashMap udvider AbstractMap til at implementere Map-interface ved hjælp af en intern Hashtable-repræsentation. Begge klasser er ikke synkroniserede, hvilket betyder, at de ikke er egnede til gevindsikre operationer.
Da Map ikke understøtter duplikatnøgler, tillader HashMap ikke duplikatnøgler, men det er tilladt at have duplikatværdier. Dette betyder, at der kan findes duplikatværdier i HashMap, men du kan bruge samling som værdi mod en eller anden nøgle. Hver nøgle skal være unik i en HashMap, og en enkelt nøgle kan ikke have tilladelse til at have mere end 1 værdi. HashSet kan på den anden side ikke have duplikatelementer udelukkende ved definitionen af et sæt, hvilket betyder, at du ikke kan gemme duplikatværdier i HashSet. HashMap tillader kun en nulnøgle, men tillader et hvilket som helst antal nulværdier, mens HashSet kun tillader en nulværdi.
HashMap arbejder med hashing-princippet, hvilket betyder, at det bruger en hash-funktion til at kortlægge identifikation af værdier internt ved hjælp af hash-algoritmen for at muliggøre nem genfinding. En ægte hashmekanisme returnerer altid den samme hashCode (), når den anvendes til det samme objekt. HashSet bruger på den anden side internt HashMap som en databasestruktur til at tilføje eller gemme objekter. Dette betyder, at når der oprettes et objekt fra HashSet, vil det oprette et objekt med HashMap.
Selvom både HashMap og HashSet ikke er synkroniserede, hvilket betyder, at de ikke er egnede til gevindsikre operationer, og de er helt forskellige konstruktioner, giver de konstant tidsydelse for basale operationer som tilføjelse, fjernelse af element osv. Mens HashMap er en generel implementering af Map-grænsefladen, der gemmer nøgle- / værdipar, HashSet er en implementering af Set-grænsefladen. En HashSet bruger en HashMap til at bakke op om dens implementering. En HashMap bruger imidlertid hashing-princippet og bruger det til hurtigt at jage efter nøglen.