logo

HashSet v Javi

Java HashSet implementira vmesnik Set, podprt z zgoščeno tabelo, ki je pravzaprav primerek HashMap. Nobenega jamstva ni za vrstni red ponovitev zgoščevalnih nizov, kar pomeni, da razred ne zagotavlja stalnega vrstnega reda elementov skozi čas. Ta razred dovoljuje ničelni element. Razred ponuja tudi stalno časovno zmogljivost za osnovne operacije, kot so dodajanje, odstranjevanje, vsebuje in velikost, ob predpostavki, da zgoščevalna funkcija pravilno razprši elemente med vedri, kar bomo videli v nadaljevanju članka.

Funkcije Java HashSet

Spodaj je omenjenih nekaj pomembnih funkcij HashSeta:

  • Izvaja Nastavite vmesnik .
  • Osnovna podatkovna struktura za HashSet je Razpršitvena tabela .
  • Ker izvaja Set Interface, podvojene vrednosti niso dovoljene.
  • Ni zajamčeno, da bodo predmeti, ki jih vstavite v HashSet, vstavljeni v istem vrstnem redu. Objekti so vstavljeni na podlagi njihove zgoščene kode.
  • Elementi NULL so dovoljeni v HashSet.
  • HashSet izvaja tudi Serializable in Klonirati vmesniki.

Deklaracija HashSeta

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

kje IN je vrsta elementov, shranjenih v HashSet.



Primer HashSet Java

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());> >}> }>

anakonda proti kači piton
>

>

Izhod:

1>

Preden shrani predmet, HashSet preveri, ali obstaja obstoječ vnos z uporabo metod hashCode() in equals(). V zgornjem primeru veljata dva seznama za enaka, če imata enake elemente v istem vrstnem redu. Ko prikličete hashCode() metodi na obeh seznamih, bi oba dala isti hash, ker sta enaka.

Opomba: HashSet počne ne shranjujte podvojenih elementov , če podate dva enaka predmeta, shrani samo prvega, tukaj je list1.

Hierarhija HashSeta je naslednja:

Notranje delovanje HashSeta

Vse razrede vmesnika Set interno varnostno kopira Map. HashSet uporablja HashMap za interno shranjevanje svojega predmeta. Gotovo se sprašujete, da za vnos vrednosti v HashMap potrebujemo par ključ-vrednost, v HashSet pa posredujemo samo eno vrednost.

Shranjevanje v HashMap: Pravzaprav vrednost, ki jo vstavimo v HashSet, deluje kot ključ do predmeta zemljevida in za svojo vrednost java uporablja konstantno spremenljivko. Torej bodo v paru ključ-vrednost vse vrednosti enake.

Implementacija HashSet v 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();>

Če pogledamo na dodaj() metoda razreda HashSet:

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

Opazimo lahko, da metoda add() razreda HashSet interno kliče daj() metoda podpore objektu HashMap s posredovanjem elementa, ki ste ga podali kot ključ, in konstante PRESENT kot njegove vrednosti. Odstrani() tudi metoda deluje na enak način. Interno pokliče metodo odstranitve vmesnika zemljevida.

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

HashSet ne shranjuje samo edinstvenih predmetov, ampak tudi edinstveno zbirko predmetov kot ArrayList , LinkedList , vektor itd.

Konstruktorji razreda HashSet

Če želite ustvariti HashSet, moramo ustvariti objekt razreda HashSet. Razred HashSet je sestavljen iz različnih konstruktorjev, ki omogočajo možno ustvarjanje HashSeta. V tem razredu so na voljo naslednji konstruktorji.

1. HashSet()

Ta konstruktor se uporablja za izdelavo praznega objekta HashSet, v katerem je privzeta začetna zmogljivost 16 in privzeti faktor obremenitve 0,75. Če želimo ustvariti prazen HashSet z imenom hs, ga lahko ustvarimo kot:

HashSet hs = new HashSet();>

2. HashSet(int initialCapacity)

Ta konstruktor se uporablja za gradnjo praznega objekta HashSet, v katerem je začetniCapacity določen v času ustvarjanja objekta. Tu ostaja privzeti loadFactor 0,75.

HashSet hs = new HashSet(int initialCapacity);>

3. HashSet(int initialCapacity, float loadFactor)

Ta konstruktor se uporablja za gradnjo praznega objekta HashSet, v katerem sta začetna zmogljivost in faktor nalaganja podana v času ustvarjanja objekta.

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

4. HashSet (zbirka)

Ta konstruktor se uporablja za izdelavo objekta HashSet, ki vsebuje vse elemente iz dane zbirke. Skratka, ta konstruktor se uporablja, ko je potrebna kakršna koli pretvorba iz katerega koli objekta zbirke v objekt HashSet. Če želimo ustvariti HashSet z imenom hs, ga lahko ustvarimo kot:

HashSet hs = new HashSet(Collection C);>

Spodaj je izvajanje zgornjih tem:

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());> >}> }>

>

>

Izhod:

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

Metode v HashSet

METODA

OPIS

dodaj (in in) Uporablja se za dodajanje podanega elementa, če ni prisoten, če je prisoten, vrne false.
počisti() Uporablja se za odstranitev vseh elementov iz kompleta.
vsebuje (predmet o) Uporablja se za vrnitev true, če je element prisoten v nizu.
odstrani (predmet o) Uporablja se za odstranitev elementa, če je prisoten v nizu.
iterator() Uporablja se za vrnitev iteratorja nad elementom v nizu.
je prazno() Uporablja se za preverjanje, ali je niz prazen ali ne. Vrne true za prazno in false za neprazen pogoj za niz.
velikost () Uporablja se za vrnitev velikosti nabora.
klon() Uporablja se za ustvarjanje plitke kopije kompleta.

Izvajanje različnih operacij na HashSet

Poglejmo, kako izvesti nekaj pogosto uporabljenih operacij na HashSet.

1. Dodajanje elementov v HashSet

Za dodajanje elementa v HashSet lahko uporabimo metodo add(). Vendar se vrstni red vstavljanja ne ohrani v HashSet. Upoštevati moramo, da podvojeni elementi niso dovoljeni in da so vsi podvojeni elementi prezrti.

Primer

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);> >}> }>

>

>

Izhod:

HashSet elements : [Geek, For, Geeks]>

2. Odstranjevanje elementov v HashSet

Vrednosti je mogoče odstraniti iz HashSet z uporabo metode remove().

Primer

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'>));> >}> }>

>

>

Izhod:

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

3. Ponavljanje skozi HashSet

Iterirajte skozi elemente HashSet z uporabo metode iterator(). Tudi najbolj znana je uporaba izboljšana zanka for.

Primer

Kodni blok

Izhod

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

Časovna zapletenost operacij HashSet: Osnovna podatkovna struktura za HashSet je hashtable. Torej amortizirajte (v povprečju ali običajnem primeru) časovno zapletenost za operacijo dodajanja, odstranjevanja in iskanja (vsebuje metodo) HashSet O(1) čas.

Zmogljivost HashSeta

HashSet razširja razred Abstract Set in izvaja Set , možnost kloniranja in Serializable vmesniki, kjer je E vrsta elementov, ki jih vzdržuje ta niz. Neposredno znan podrazred HashSet je LinkedHashSet.

Zdaj za vzdrževanje stalne časovne zmogljivosti ponavljanje prek HashSeta zahteva čas, ki je sorazmeren vsoti velikosti primerka HashSet (število elementov) in zmogljivosti podpornega primerka HashMap (število veder). Zato je zelo pomembno, da ne nastavite previsoke začetne zmogljivosti (ali prenizkega faktorja obremenitve), če je zmogljivost ponovitve pomembna.

  • Začetna zmogljivost: Začetna zmogljivost pomeni število veder, ko je ustvarjena zgoščena tabela (HashSet interno uporablja podatkovno strukturo zgoščene tabele). Število veder se bo samodejno povečalo, če bo trenutna velikost polna.
  • Faktor obremenitve: Faktor obremenitve je merilo, kako poln je HashSet, preden se njegova zmogljivost samodejno poveča. Ko število vnosov v zgoščevalno tabelo preseže zmnožek faktorja obremenitve in trenutne zmogljivosti, se zgoščevalna tabela ponovno zgosti (to pomeni, da se notranje podatkovne strukture ponovno zgradijo), tako da ima zgoščevalna tabela približno dvakratno število veder.
 Number of stored elements in the table Load Factor = ----------------------------------------- Size of the hash table>

primer: Če je notranja zmogljivost 16 in je faktor obremenitve 0,75, se bo število veder samodejno povečalo, ko bo v tabeli 12 elementov.

Vpliv na učinkovitost:

Faktor obremenitve in začetna zmogljivost sta dva glavna dejavnika, ki vplivata na delovanje operacij HashSet. Faktor obremenitve 0,75 zagotavlja zelo učinkovito delovanje glede na časovno in prostorsko kompleksnost. Če povečamo vrednost faktorja obremenitve za več kot to, se bodo stroški pomnilnika zmanjšali (ker bo zmanjšala operacijo notranje obnove), vendar bo to vplivalo na operacijo dodajanja in iskanja v zgoščevalni tabeli. Da bi zmanjšali postopke ponovne obdelave, bi morali pametno izbrati začetno zmogljivost. Če je začetna zmogljivost večja od največjega števila vnosov, deljenega s faktorjem obremenitve, se operacija ponovne obdelave ne bo nikoli zgodila.

Opomba: Implementacija v HashSet ni sinhronizirana v smislu, da če več niti istočasno dostopa do zgoščenega nabora in vsaj ena od niti spremeni nabor, mora biti sinhronizirana zunaj. To se običajno doseže s sinhronizacijo nekega predmeta, ki naravno zajema nabor. Če tak objekt ne obstaja, je treba nabor zaviti z metodo Collections.synchronizedSet. To je najbolje narediti v času ustvarjanja, da preprečite nenamerni nesinhroniziran dostop do niza, kot je prikazano spodaj:

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

Metode, uporabljene s HashSet

1. Metode, podedovane iz razreda java.util.AbstractSet

Metoda

Opis

enako () Uporablja se za preverjanje enakosti objekta s HashSet in njuno primerjavo. Seznam vrne true le, če oba HashSet vsebujeta iste elemente, ne glede na vrstni red.
hashcode() Vrne vrednost zgoščene kode za ta niz.
odstraniVse(zbirka) Ta metoda se uporablja za odstranitev vseh elementov iz zbirke, ki so prisotni v nizu. Ta metoda vrne true, če se ta niz spremeni kot rezultat klica.

2. Metode, podedovane iz razreda java.util.AbstractCollection

METODA

OPIS

addAll(zbirka)

Ta metoda se uporablja za dodajanje vseh elementov iz omenjene zbirke obstoječemu nizu.

Elementi se dodajajo naključno brez upoštevanja kakršnega koli posebnega vrstnega reda.

vsebujeVse(zbirka)

Ta metoda se uporablja za preverjanje, ali nabor vsebuje vse elemente, ki so prisotni v dani zbirki ali ne.

Ta metoda vrne true, če nabor vsebuje vse elemente, in vrne false, če kateri od elementov manjka.

ohraniVse(zbirka) Ta metoda se uporablja za ohranitev vseh elementov iz niza, ki so omenjeni v dani zbirki. Ta metoda vrne true, če se je ta niz spremenil zaradi klica.
toArray() Ta metoda se uporablja za oblikovanje matrike enakih elementov, kot je nabor.
toString() Metoda toString() Java HashSet se uporablja za vrnitev nizovne predstavitve elementov zbirke HashSet.

3. Metode, deklarirane v vmesniku java.util.Collection

METODA

OPIS

parallelStream() Vrne morebitni vzporedni tok s to zbirko kot virom.
removeIf? (Predikatni filter) Odstrani vse elemente te zbirke, ki izpolnjujejo dani predikat.
tok () Vrne zaporedni tok s to zbirko kot izvorom.
toArray? (generator IntFunction) Vrne matriko, ki vsebuje vse elemente v tej zbirki, z uporabo ponujene funkcije generatorja za dodelitev vrnjene matrike.

4. Metode, deklarirane v vmesniku java.lang.Iterable

METODA

OPIS

forEach? (ukrep potrošnika) Izvede dano dejanje za vsak element Iterable, dokler niso vsi elementi obdelani ali dejanje vrže izjemo.

5. Metode, deklarirane v vmesniku java.util.Set

METODA

OPIS

addAll? (Zbirka c) Temu naboru doda vse elemente v navedeni zbirki, če še niso prisotni (izbirna operacija).
vsebujeVse? (Zbirka c) Vrne true, če ta niz vsebuje vse elemente podane zbirke.
je enako? (Predmet o) Primerja navedeni predmet s tem nizom za enakost.
hashCode() Vrne vrednost zgoščene kode za ta niz.
removeAll? (Zbirka c) Iz tega nabora odstrani vse njegove elemente, ki so vsebovani v navedeni zbirki (izbirna operacija).
retainAll? (Zbirka c) Ohrani le elemente v tem nizu, ki so vsebovani v navedeni zbirki (izbirna operacija).
toArray() Vrne matriko, ki vsebuje vse elemente v tem nizu.
toArray?(T[] a) Vrne matriko, ki vsebuje vse elemente v tem nizu; vrsta izvajalnega časa vrnjene matrike je navedena matrika.

Pogosta vprašanja v HashSet v Javi

Q1. Kaj je HashSet v Javi?

odgovor:

HashSet je vrsta razreda, ki razširja AbstractSet in implementira vmesnike Set.

Q2. Zakaj se uporablja HashSet?

odgovor:

HashSet se uporablja za izogibanje podvojenim podatkom in iskanje vrednosti s hitro metodo.

Q3. Razlike med HashSet in HashMap.

odgovor:

Osnova

HashSet

HashMap

java za vrste zank
Izvedba HashSet implementira vmesnik Set. HashMap implementira vmesnik storesMap.
Dvojniki HashSet ne dovoljuje podvojenih vrednosti. HashMap shrani pare ključev in vrednosti in ne dovoljuje podvojenih ključev. Če je ključ podvojen, se stari ključ nadomesti z novo vrednostjo.
Število predmetov med shranjevanjem objektov HashSet zahteva samo en dodatek objekta (Object o). HashMap zahteva dva predmeta put (ključ K, vrednost V), da dodate element objektu HashMap.
Navidezna vrednost HashSet interno uporablja HashMap za dodajanje elementov. V HashSet argument, posredovan v metodi add(Object), služi kot ključ K. Java interno poveže navidezno vrednost za vsako vrednost, posredovano v metodi add(Object). HashMap nima pojma navidezne vrednosti.
Shranjevanje ali dodajanje mehanizma HashSet interno uporablja objekt HashMap za shranjevanje ali dodajanje predmetov. HashMap interno uporablja zgoščevanje za shranjevanje ali dodajanje predmetov
Hitreje HashSet je počasnejši od HashMap. HashMap je hitrejši od HashSeta.
Vstavljanje HashSet uporablja metodo add() za dodajanje ali shranjevanje podatkov. HashMap uporablja metodo put() za shranjevanje podatkov.
Primer HashSet je niz, npr. {1, 2, 3, 4, 5, 6, 7}. HashMap je preslikava para ključ -> vrednost (ključ do vrednosti), npr. {a -> 1, b -> 2, c -> 2, d -> 1}.

Q4. Razlike med HashSet in TreeSet v Javi.

odgovor:

Osnova

HashSet

TreeSet

Hitrost in notranja izvedba, met akcije Za operacije, kot so iskanje, vstavljanje in brisanje. Za te operacije je v povprečju potreben stalni čas. HashSet je hitrejši od TreeSet. HashSet je implementiran z uporabo zgoščene tabele. TreeSet vzame O(Log n) za iskanje, vstavljanje in brisanje, ki je višji od HashSet. Toda TreeSet hrani razvrščene podatke. Podpira tudi operacije, kot so višje() (vrne najmanj višji element), floor(), strop() itd. Te operacije so tudi O(Log n) v TreeSet in niso podprte v HashSet. TreeSet je implementiran s samouravnoteženim binarnim iskalnim drevesom (rdeče-črno drevo). TreeSet podpira TreeMap v Javi.
Naročanje Elementi v HashSet niso urejeni. TreeSet vzdržuje objekte v razvrščenem vrstnem redu, ki ga definira metoda Comparable ali Comparator v Javi. Elementi TreeSet so privzeto razvrščeni v naraščajočem vrstnem redu. Ponuja več metod za obravnavo urejenega nabora, kot so first(), last(), headSet(), tailSet() itd.
Ničelen predmet HashSet dovoljuje ničelni objekt. TreeSet ne dovoljuje ničelnega predmeta in vrže NullPointerException. Zakaj, ker TreeSet uporablja metodo compareTo() za primerjavo ključev, compareTo() pa vrže java.lang.NullPointerException.
Primerjava HashSet uporablja metodo equals() za primerjavo dveh objektov v Setu in za odkrivanje dvojnikov. TreeSet za isti namen uporablja metodo compareTo(). Če equals() in compareTo() nista konsistentna, tj. za dva enaka objekta bi morala equals vrniti true, medtem ko compareTo() vrniti nič, potem bo prekinil pogodbo vmesnika Set in omogočil dvojnike v implementacijah Set, kot je TreeSet