logo

HashSet i Java

Java HashSet class implementerar Set-gränssnittet, med stöd av en hash-tabell som faktiskt är en HashMap-instans. Ingen garanti ges för iterationsordningen för hash-uppsättningarna vilket innebär att klassen inte garanterar den konstanta ordningen av element över tiden. Denna klass tillåter null-elementet. Klassen erbjuder också konstant tidsprestanda för de grundläggande operationerna som lägg till, ta bort, innehåller och storlek förutsatt att hashfunktionen sprider elementen ordentligt bland hinkarna, vilket vi kommer att se längre fram i artikeln.

Java HashSet-funktioner

Några viktiga funktioner i HashSet nämns nedan:

  • Verktyg Ställ in gränssnitt .
  • Den underliggande datastrukturen för HashSet är Hastbar .
  • Eftersom det implementerar Set Interface, är dubbletter av värden inte tillåtna.
  • Objekt som du infogar i HashSet är inte garanterade att infogas i samma ordning. Objekt infogas baserat på deras hashkod.
  • NULL-element är tillåtna i HashSet.
  • HashSet implementerar också Serialiserbar och Klonbar gränssnitt.

Deklaration av HashSet

public class HashSet extends AbstractSet implements Set, Cloneable, Serializable>

var OCH är den typ av element som lagras i en HashSet.



HashSet Java Exempel

Java




// Java program to illustrate the concept> // of Collection objects storage in a HashSet> import> java.io.*;> import> java.util.*;> > class> CollectionObjectStorage {> > >public> static> void> main(String[] args)> >{> >// Instantiate an object of HashSet> >HashSet set =>new> HashSet();> > >// create ArrayList list1> >ArrayList list1 =>new> ArrayList();> > >// create ArrayList list2> >ArrayList list2 =>new> ArrayList();> > >// Add elements using add method> >list1.add(>1>);> >list1.add(>2>);> >list2.add(>1>);> >list2.add(>2>);> >set.add(list1);> >set.add(list2);> > >// print the set size to understand the> >// internal storage of ArrayList in Set> >System.out.println(set.size());> >}> }>

"murarens formel"
>

>

Produktion:

1>

Innan ett objekt lagras kontrollerar HashSet om det finns en befintlig post med metoderna hashCode() och equals(). I exemplet ovan anses två listor vara lika om de har samma element i samma ordning. När du åberopar hash-kod() metod på de två listorna skulle de båda ge samma hash eftersom de är lika.

Notera: HashSet gör det lagra inte dubbletter , om du ger två objekt som är lika lagrar den bara det första, här är det list1.

Hierarkin för HashSet är som följer:

Internt arbete av en hashset

Alla klasser i Set-gränssnittet säkerhetskopieras internt av Map. HashSet använder HashMap för att lagra sitt objekt internt. Du måste undra att för att ange ett värde i HashMap behöver vi ett nyckel-värdepar, men i HashSet skickar vi bara ett värde.

Lagring i HashMap: Egentligen fungerar värdet vi infogar i HashSet som en nyckel till kartobjektet och för dess värde använder java en konstant variabel. Så i nyckel-värdeparet kommer alla värden att vara desamma.

Implementering av HashSet i Java doc

private transient HashMap map; // Constructor - 1 // All the constructors are internally creating HashMap Object. public HashSet() { // Creating internally backing HashMap object map = new HashMap(); } // Constructor - 2 public HashSet(int initialCapacity) { // Creating internally backing HashMap object map = new HashMap(initialCapacity); } // Dummy value to associate with an Object in Map private static final Object PRESENT = new Object();>

Om vi ​​tittar på Lägg till() metod för HashSet-klassen:

public boolean add(E e) { return map.put(e, PRESENT) == null; }>

Vi kan märka att add()-metoden för klassen HashSet internt anropar sätta() metod för att backa upp HashMap-objektet genom att skicka elementet du har angett som en nyckel och konstant PRESENT som dess värde. avlägsna() Metoden fungerar också på samma sätt. Den anropar internt borttagningsmetoden för kartgränssnittet.

public boolean remove(Object o) { return map.remove(o) == PRESENT; }>

HashSet lagrar inte bara unika objekt utan också en unik samling av objekt tycka om ArrayList , Länkad lista , vektor ..osv.

Konstruktörer av HashSet-klassen

För att skapa ett HashSet måste vi skapa ett objekt av klassen HashSet. Klassen HashSet består av olika konstruktörer som möjliggör skapandet av HashSet. Följande är de konstruktörer som är tillgängliga i den här klassen.

1. HashSet()

Den här konstruktorn används för att bygga ett tomt HashSet-objekt där standardinitialkapaciteten är 16 och standardbelastningsfaktorn är 0,75. Om vi ​​vill skapa ett tomt hashset med namnet hs, kan det skapas som:

HashSet hs = new HashSet();>

2. HashSet(int initialCapacity)

Denna konstruktor används för att bygga ett tomt HashSet-objekt där initialCapacity anges vid tidpunkten för objektskapandet. Här förblir standard loadFactor 0,75.

HashSet hs = new HashSet(int initialCapacity);>

3. HashSet(int initialCapacity, float loadFactor)

Denna konstruktor används för att bygga ett tomt HashSet-objekt där initialCapacity och loadFactor specificeras vid tidpunkten för objektskapandet.

HashSet hs = new HashSet(int initialCapacity, float loadFactor);>

4. HashSet (samling)

Denna konstruktor används för att bygga ett HashSet-objekt som innehåller alla element från den givna samlingen. Kort sagt, denna konstruktor används när någon konvertering behövs från något Collection-objekt till HashSet-objektet. Om vi ​​vill skapa ett HashSet med namnet hs kan det skapas som:

HashSet hs = new HashSet(Collection C);>

Nedan följer implementeringen av ovanstående ämnen:

Java




// Java program to Demonstrate Working> // of HashSet Class> > // Importing required classes> import> java.util.*;> > // Main class> // HashSetDemo> class> GFG {> > >// Main driver method> >public> static> void> main(String[] args)> >{> > >// Creating an empty HashSet> >HashSet h =>new> HashSet();> > >// Adding elements into HashSet> >// using add() method> >h.add(>'India'>);> >h.add(>'Australia'>);> >h.add(>'South Africa'>);> > >// Adding duplicate elements> >h.add(>'India'>);> > >// Displaying the HashSet> >System.out.println(h);> >System.out.println(>'List contains India or not:'> >+ h.contains(>'India'>));> > >// Removing items from HashSet> >// using remove() method> >h.remove(>'Australia'>);> >System.out.println(>'List after removing Australia:'> >+ h);> > >// Display message> >System.out.println(>'Iterating over list:'>);> > >// Iterating over hashSet items> >Iterator i = h.iterator();> > >// Holds true till there is single element remaining> >while> (i.hasNext())> > >// Iterating over elements> >// using next() method> >System.out.println(i.next());> >}> }>

>

>

Produktion:

[South Africa, Australia, India] List contains India or not:true List after removing Australia:[South Africa, India] Iterating over list: South Africa India>

Metoder i HashSet

METOD

BESKRIVNING

lägg till (och och) Används för att lägga till det angivna elementet om det inte finns, om det finns returnerar det false.
klar() Används för att ta bort alla element från setet.
innehåller(Objekt o) Används för att returnera sant om ett element finns i en uppsättning.
ta bort(Objekt o) Används för att ta bort elementet om det finns i setet.
iterator() Används för att returnera en iterator över elementet i uppsättningen.
är tom() Används för att kontrollera om setet är tomt eller inte. Returnerar sant för tomt och falskt för ett icke-tomt villkor för set.
storlek() Används för att returnera storleken på setet.
klona() Används för att skapa en ytlig kopia av setet.

Utföra olika operationer på HashSet

Låt oss se hur du utför några ofta använda operationer på HashSet.

1. Lägga till element i HashSet

För att lägga till ett element till HashSet kan vi använda metoden add() . Insättningsordningen behålls dock inte i HashSet. Vi måste notera att duplicerade element inte är tillåtna och alla duplicerade element ignoreras.

Exempel

Java




// Java program to Adding Elements to HashSet> > // Importing required classes> import> java.io.*;> import> java.util.*;> > // Main class> // AddingElementsToHashSet> class> GFG {> > >// Method 1> >// Main driver method> >public> static> void> main(String[] args)> >{> >// Creating an empty HashSet of string entities> >HashSet hs =>new> HashSet();> > >// Adding elements using add() method> >hs.add(>'Geek'>);> >hs.add(>'For'>);> >hs.add(>'Geeks'>);> > >// Printing all string el=ntries inside the Set> >System.out.println(>'HashSet elements : '> + hs);> >}> }>

>

>

Produktion:

HashSet elements : [Geek, For, Geeks]>

2. Ta bort element i HashSet

Värdena kan tas bort från HashSet med metoden remove().

Exempel

Java




// Java program Illustrating Removal Of Elements of HashSet> > // Importing required classes> import> java.io.*;> import> java.util.*;> > // Main class> // RemoveElementsOfHashSet> class> GFG {> > >// Main driver method> >public> static> void> main(String[] args)> >{> >// Creating an> >HashSet hs =>new> HashSet();> > >// Adding elements to above Set> >// using add() method> >hs.add(>'Geek'>);> >hs.add(>'For'>);> >hs.add(>'Geeks'>);> >hs.add(>'A'>);> >hs.add(>'B'>);> >hs.add(>'Z'>);> > >// Printing the elements of HashSet elements> >System.out.println(>'Initial HashSet '> + hs);> > >// Removing the element B> >hs.remove(>'B'>);> > >// Printing the updated HashSet elements> >System.out.println(>'After removing element '> + hs);> > >// Returns false if the element is not present> >System.out.println(>'Element AC exists in the Set : '> >+ hs.remove(>'AC'>));> >}> }>

>

>

Produktion:

Initial HashSet [A, B, Geek, For, Geeks, Z] After removing element [A, Geek, For, Geeks, Z] Element AC exists in the Set : false>

3. Itererar genom HashSet

Iterera genom elementen i HashSet med metoden iterator(). Den mest kända är också att använda förbättrad för loop.

Exempel

Kodblock

Produktion

A, B, Geek, For, Geeks, Z, A, B, Geek, For, Geeks, Z,>

Tidskomplexitet för HashSet-operationer: Den underliggande datastrukturen för HashSet är hashbar. Så amortera (genomsnittligt eller vanligt fall) tidskomplexitet för att lägga till, ta bort och slå upp (innehåller metod) drift av HashSet tar O(1) tid.

Prestanda för HashSet

HashSet utökar Abstract Set-klassen och implementerar Uppsättning , Klonbar och Serialiserbar gränssnitt där E är den typ av element som underhålls av denna uppsättning. Den direkt kända underklassen av HashSet är LinkedHashSet .

Nu för att upprätthålla konstant tidsprestanda kräver iteration över HashSet tid proportionell mot summan av HashSet-instansens storlek (antalet element) plus kapaciteten för den stödjande HashMap-instansen (antalet hinkar). Därför är det mycket viktigt att inte ställa in den initiala kapaciteten för högt (eller belastningsfaktorn för låg) om iterationsprestanda är viktigt.

  • Initial kapacitet: Den initiala kapaciteten betyder antalet hinkar när hashtabellen (HashSet använder internt hashbar datastruktur) skapas. Antalet hinkar kommer att ökas automatiskt om den aktuella storleken blir full.
  • Belastningsfaktor: Belastningsfaktorn är ett mått på hur fullt HashSet tillåts bli innan dess kapacitet automatiskt ökas. När antalet poster i hashtabellen överstiger produkten av belastningsfaktorn och den aktuella kapaciteten, hashas hashtabellen om (det vill säga interna datastrukturer byggs om) så att hashtabellen har ungefär dubbelt så många buckets.
 Number of stored elements in the table Load Factor = ----------------------------------------- Size of the hash table>

Exempel: Om den interna kapaciteten är 16 och belastningsfaktorn är 0,75 så kommer antalet skopor att öka automatiskt när bordet har 12 element i sig.

Effekt på prestanda:

Belastningsfaktor och initial kapacitet är två huvudfaktorer som påverkar prestandan för HashSet-operationer. En belastningsfaktor på 0,75 ger mycket effektiv prestanda med avseende på tid och rumskomplexitet. Om vi ​​ökar belastningsfaktorvärdet mer än så kommer minneskostnader att minska (eftersom det kommer att minska den interna ombyggnadsoperationen), men det kommer att påverka add- och sökoperationen i hashtabellen. För att minska omhaskningsoperationen bör vi välja initial kapacitet klokt. Om den initiala kapaciteten är större än det maximala antalet poster dividerat med belastningsfaktorn, kommer aldrig någon rehash-operation att inträffa.

Notera: Implementeringen i en HashSet är inte synkroniserad, i den meningen att om flera trådar får åtkomst till en hash-uppsättning samtidigt, och minst en av trådarna modifierar uppsättningen, måste den synkroniseras externt. Detta åstadkoms vanligtvis genom att synkronisera på något objekt som naturligt inkapslar uppsättningen. Om inget sådant objekt finns, bör uppsättningen lindas med metoden Collections.synchronizedSet. Detta görs bäst vid skapandet för att förhindra osynkroniserad åtkomst till setet som visas nedan:

Set s = Collections.synchronizedSet(new HashSet(…));

Metoder som används med HashSet

1. Metoder som ärvts från klassen java.util.AbstractSet

Metod

Beskrivning

lika() Används för att verifiera ett objekts likhet med en hashset och jämföra dem. Listan returnerar endast sant om båda HashSet innehåller samma element, oavsett ordning.
hash-kod() Returnerar hashkodvärdet för denna uppsättning.
removeAll (samling) Denna metod används för att ta bort alla element från samlingen som finns i uppsättningen. Denna metod returnerar sant om denna uppsättning ändras som ett resultat av anropet.

2. Metoder som ärvts från klassen java.util.AbstractCollection

METOD

BESKRIVNING

addAll (samling)

Denna metod används för att lägga till alla element från den nämnda samlingen till den befintliga uppsättningen.

Elementen läggs till slumpmässigt utan att följa någon specifik ordning.

innehåller alla (samling)

Denna metod används för att kontrollera om uppsättningen innehåller alla element som finns i den givna samlingen eller inte.

Denna metod returnerar true om uppsättningen innehåller alla element och returnerar false om något av elementen saknas.

retainAll (samling) Denna metod används för att behålla alla element från uppsättningen som nämns i den givna samlingen. Denna metod returnerar sant om denna uppsättning ändras som ett resultat av anropet.
toArray() Denna metod används för att bilda en array av samma element som den i Setet.
att stränga() Metoden toString() för Java HashSet används för att returnera en strängrepresentation av elementen i HashSet Collection.

3. Metoder deklarerade i gränssnittet java.util.Collection

METOD

BESKRIVNING

oj i java
parallellStream() Returnerar en möjligen parallell ström med den här samlingen som källa.
removeIf?(Predikatfilter) Tar bort alla element i den här samlingen som uppfyller det givna predikatet.
ström() Returnerar en sekventiell ström med den här samlingen som källa.
toArray? (IntFunction generator) Returnerar en array som innehåller alla elementen i denna samling, med hjälp av den medföljande generatorfunktionen för att allokera den returnerade arrayen.

4. Metoder deklarerade i gränssnittet java.lang.Iterable

METOD

BESKRIVNING

för varje? (Konsumentåtgärd) Utför den givna åtgärden för varje element i Iterable tills alla element har bearbetats eller åtgärden ger ett undantag.

5. Metoder deklarerade i gränssnittet java.util.Set

METOD

BESKRIVNING

addAll? (Samling c) Lägger till alla element i den angivna samlingen till denna uppsättning om de inte redan finns (valfri operation).
innehåller allt? (Samling c) Returnerar sant om denna uppsättning innehåller alla element i den angivna samlingen.
lika?(Objekt o) Jämför det angivna objektet med denna uppsättning för likhet.
hash-kod() Returnerar hashkodvärdet för denna uppsättning.
removeAll? (Samling c) Tar bort från denna uppsättning alla dess element som finns i den angivna samlingen (valfri operation).
behållaAlla?(Samling c) Behåller endast de element i denna uppsättning som finns i den angivna samlingen (valfri operation).
toArray() Returnerar en array som innehåller alla element i denna uppsättning.
toArray?(T[] a) Returnerar en array som innehåller alla element i denna uppsättning; körtidstypen för den returnerade arrayen är den för den angivna arrayen.

Vanliga frågor i HashSet i Java

Q1. Vad är HashSet i Java?

Svar:

HashSet är en typ av klass som utökar AbstractSet och implementerar Set-gränssnitt.

Q2. Varför används HashSet?

Svar:

HashSet används för att undvika dubbletter av data och för att hitta värde med den snabba metoden.

Q3. Skillnader mellan HashSet och HashMap.

Svar:

Grund

HashSet

HashMap

Genomförande HashSet implementerar ett Set-gränssnitt. HashMap implementerar ett storesMap-gränssnitt.
Dubletter HashSet tillåter inte dubbletter av värden. HashMap lagrar nyckel- och värdeparen och tillåter inte dubbletter av nycklar. Om nyckeln är duplicerad ersätts den gamla nyckeln med det nya värdet.
Antal objekt under lagring av objekt HashSet kräver bara ett objekt add(Object o). HashMap kräver två objekt placerade (K-nyckel, V-värde) för att lägga till ett element till HashMap-objektet.
Dummy värde HashSet använder internt HashMap för att lägga till element. I HashSet fungerar argumentet som skickas i add(Object)-metoden som nyckel K. Java associerar internt ett dummyvärde för varje värde som skickas i add(Object)-metoden. HashMap har inget begrepp om dummyvärde.
Lagra eller lägga till en mekanism HashSet använder internt HashMap-objektet för att lagra eller lägga till objekten. HashMap använder internt hashing för att lagra eller lägga till objekt
Snabbare HashSet är långsammare än HashMap. HashMap är snabbare än HashSet.
Införande HashSet använder metoden add() för att lägga till eller lagra data. HashMap använder put()-metoden för att lagra data.
Exempel HashSet är en uppsättning, t.ex. {1, 2, 3, 4, 5, 6, 7}. HashMap är en nyckel -> värdepar (nyckel till värde) karta, t.ex. {a -> 1, b -> 2, c -> 2, d -> 1}.

Q4. Skillnader mellan HashSet och TreeSet i Java.

Svar:

Grund

HashSet

Träduppsättning

Hastighet och interna genomföra, kasta åtgärd För operationer som att söka, infoga och ta bort. Det tar i genomsnitt konstant tid för dessa operationer. HashSet är snabbare än TreeSet. HashSet implementeras med hjälp av en hashtabell. TreeSet tar O(Log n) för sökning, infoga och ta bort som är högre än HashSet. Men TreeSet håller sorterad data. Den stöder också operationer som högre() (Returnerar minst högre element), floor(), loft(), etc. Dessa operationer är också O(Log n) i TreeSet och stöds inte i HashSet. TreeSet implementeras med hjälp av ett självbalanserande binärt sökträd (röd-svart träd). TreeSet stöds av TreeMap i Java.
Beställning Element i HashSet är inte beställda. TreeSet underhåller objekt i sorterad ordning som definieras av antingen Comparable- eller Comparator-metoden i Java. TreeSet-element sorteras som standard i stigande ordning. Det erbjuder flera metoder för att hantera den beställda uppsättningen som first(), last(), headSet(), tailSet(), etc.
Null objekt HashSet tillåter null-objektet. TreeSet tillåter inte null Object och kastar NullPointerException, varför, beror på att TreeSet använder metoden compareTo() för att jämföra nycklar, och compareTo() kommer att kasta java.lang.NullPointerException.
Jämförelse HashSet använder metoden equals() för att jämföra två objekt i uppsättningen och för att upptäcka dubbletter. TreeSet använder metoden compareTo() för samma ändamål. Om equals() och compareTo() inte är konsekventa, dvs. för två lika objekt bör lika returnera true medan compareTo() ska returnera noll, då kommer det att bryta kontraktet för Set-gränssnittet och tillåta dubbletter i Set-implementationer som TreeSet