När du lär dig ett nytt datorspråk är en av de första sakerna du brukar fråga om hur du arbetar med stora datagrupper. Detta ämne omfattas ofta av ämnet "Datastrukturer". Om du gräver djupare måste du komma över ämnen som länkade listor, köer, staplar och binära träd bland många andra datastrukturer. I Java är dessa strukturer en del av Java Collections Framework. En samling är ingenting annat än en typ av datastruktur som refererar till en gruppering av flera dataelement och Java Collections Framework standardiserar hur dessa grupper av objekt hanteras. Faktum är att samlingsramen utformades för att uppfylla flera mål.
Hela samlingsramen är utformad kring en uppsättning standard gränssnitt. Flera standard implementeringar som LinkedList, HashSet och TreeSet tillhandahålls av dessa gränssnitt som du kan vara. Dessutom kan du även implementera din egen samling om du väljer. Men förutom samlingar definierar ramverket flera kartgränssnitt och klasser. Java innehåller tre generella kart implementeringar - HashMap, TreeMap och LinkedHashMap - vilka butiksnycklar / värdespar. Även om kartor inte är tekniska samlingar, är de helt integrerade med samlingar. Faktum är att kartor fokuserar på grupper av samband mellan objekt. Denna artikel sammanfattar de viktigaste skillnaderna mellan HashMap och HashSet.
HashMap är den vanligaste implementeringen av Map-gränssnittet som ger en grundläggande nyckel / värdekarta där elementen är oordnade. Det använder ett speciellt värde kallat en hash-kod, i stället för en långsam sökning av nyckeln. Hash-koden är ett sätt att ta information i objektet i fråga och göra det till ett "relativt unikt" int för det objektet. Det fungerar helt enkelt på hash-princip, vilket innebär att det använder en hash-funktion för att kartlägga identifieringsvärden. Precis som Vector and Stack har sina ersättare i ArrayList och LinkedList, har Hashtable en ersättare i HashMap. Det utökar AbstractMap för att implementera Map-gränssnittet med hjälp av en intern Hashtable-representation. Och liknar andra generella implementeringar, stöder HashMap de valfria metoderna för Map, tillåter nullvärden och synkroniseras inte.
HashSet är en av medlemmarna i Java Collections Framework som implementerar Set-gränssnittet, bakåt med ett hashbord som faktiskt är en HashMap-förekomst. Som namnet antyder implementeras det av ett hashbord, en matris där element lagras i en position som härrör från deras innehåll. Till skillnad från en karta är Set exakt en samling med exakt samma gränssnitt, så det finns ingen extra funktionalitet som det finns med två olika listor. HashSet använder en hashing-funktion som är utformad speciellt för snabba uppslag. Det är en orörd samling unika objekt som inte kan lagra dubbla värden. HashSet utökar AbstractSet-klassen som implementerar inställningsgränssnittet. HashSet definierar dock inte några andra metoder än de som tillhandahålls av dess superklasser och gränssnitt.
HashMap är den vanligaste implementeringen av Map-gränssnittet som ger en grundläggande nyckel / värdekarta där elementen är oordnade. Det fungerar helt enkelt på hash-princip, vilket innebär att det använder en hash-funktion för att kartlägga identifieringsvärden. HashSet är å andra sidan en av medlemmarna i Java Collections Framework som implementerar Set-gränssnittet, bakåt med ett hashbord som i själva verket är en HashMap-förekomst. Enkelt uttryckt implementerar HashMap Map-gränssnittet, medan HashSet implementerar inställningsgränssnittet.
HashSet skapar en samling som använder ett hashbord för lagring. Hash-tabellen lagrar information med hjälp av en metod som kallas hashing. HashSet använder en hashing-funktion, som är speciellt utformad för snabba uppslag, för att lagra element eller värden. Huvuddelen av HashSet-funktionaliteten tillhandahålls genom superclass AbstractCollection och AbstractSet, som HashSet delar med TreeSet. HashMap utökar AbstractMap för att implementera Map-gränssnittet med hjälp av en intern Hashtable-representation. Båda klasserna är inte synkroniserade, vilket betyder att de inte är lämpliga för trådsäker drift.
Eftersom Map inte stöder dubbla nycklar tillåter HashMap inte dubbla nycklar, men det är tillåtet att ha dubbla värden. Det betyder att dubbla värden kan existera i HashMap men du kan använda insamling som värde mot någon nyckel. Varje nyckel måste vara unik i en HashMap och en enda nyckel får inte ha mer än 1 värde. HashSet, å andra sidan, kan inte ha dubbla element genom enbart definition av en uppsättning, vilket innebär att du inte kan lagra dubbla värden i HashSet. HashMap tillåter bara en nollknapp men tillåter valfritt antal nullvärden, medan HashSet endast tillåter ett nollvärde.
HashMap arbetar med hash-princip, vilket innebär att det använder en hash-funktion för att kartlägga identifieringsvärden internt med hjälp av hashingalgoritmen för att möjliggöra enkel hämtning. En sann hashing-mekanism returnerar alltid samma hashCode () när den tillämpas på samma objekt. HashSet använder däremot internt HashMap som en databasstruktur för att lägga till eller lagra objekt. Det betyder att när ett objekt av HashSet skapas skapar det ett objekt av HashMap.
Även om både HashMap och HashSet inte är synkroniserade, vilket betyder att de inte är lämpliga för trådsäkra operationer och de är helt olika konstruktioner, ger de konstant tidprestanda för grundläggande operationer som tillägg, borttagning av element etc. Medan HashMap är en allmänt ändamålsenlig implementering av Kartgränssnittet som lagrar nyckel / värdepar, HashSet är ett genomförande av Set-gränssnittet. En HashSet använder en HashMap för att återställa implementeringen. En HashMap använder dock hash-princip och använder den för att snabbt leta efter nyckeln.