Java HashSet luokka toteuttaa Set-rajapinnan, jota tukee hash-taulukko, joka on itse asiassa HashMap-instanssi. Hajautusjoukkojen iteraatiojärjestystä ei taata, mikä tarkoittaa, että luokka ei takaa elementtien jatkuvaa järjestystä ajan myötä. Tämä luokka sallii nolla-elementin. Luokka tarjoaa myös jatkuvan aikasuorituksen perustoimintoihin, kuten lisäämiseen, poistamiseen, sisältää ja kokoon, olettaen, että hash-funktio hajottaa elementit oikein ämpäriin, mitä tulemme näkemään artikkelissa lisää.
Java HashSet -ominaisuudet
Muutamia tärkeitä HashSetin ominaisuuksia mainitaan alla:
- Toteuttaa Aseta käyttöliittymä .
- HashSetin taustalla oleva tietorakenne on Hashtable .
- Koska se toteuttaa Set Interface -rajapinnan, päällekkäiset arvot eivät ole sallittuja.
- HashSetissä lisäämäsi objektit eivät ole taattuja samassa järjestyksessä. Objektit lisätään niiden hash-koodin perusteella.
- NULL-elementit ovat sallittuja HashSetissä.
- HashSet myös toteuttaa Sarjasoitavissa ja Kloonattavissa käyttöliittymät.
HashSetin ilmoitus
public class HashSet extends AbstractSet implements Set, Cloneable, Serializable>
missä JA on HashSetiin tallennettujen elementtien tyyppi.
HashSet Java esimerkki
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());> >}> }> |
datalinkkikerroksen protokollia
>
>Lähtö:
1>
Ennen objektin tallentamista HashSet tarkistaa, onko olemassa merkintää käyttämällä hashCode()- ja equals()-menetelmiä. Yllä olevassa esimerkissä kahta listaa pidetään samanarvoisena, jos niillä on samat elementit samassa järjestyksessä. Kun kutsut hash koodin() kahdessa luettelossa oleva menetelmä, ne molemmat antaisivat saman hashin, koska ne ovat samanarvoisia.
Huomautus: HashSet tekee Älä säilytä päällekkäisiä kohteita , jos annat kaksi yhtä suurta objektia, se tallentaa vain ensimmäisen, tässä se on lista1.
HashSetin hierarkia on seuraava:
HashSetin sisäinen toiminta
Map varmuuskopioi sisäisesti kaikki Set-käyttöliittymän luokat. HashSet käyttää HashMapia objektinsa sisäiseen tallentamiseen. Ihmettelet varmasti, että arvon syöttämiseksi HashMapiin tarvitsemme avain-arvo-parin, mutta HashSetissä välitämme vain yhden arvon.
Tallennus HashMapissa: Itse asiassa arvo, jonka lisäämme HashSetiin, toimii avaimena karttaobjektille ja sen arvoksi java käyttää vakiomuuttujaa. Joten avain-arvo-parissa kaikki arvot ovat samat.
HashSetin käyttöönotto Java-dokumentissa
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();> Jos katsomme lisätä() HashSet-luokan menetelmä:
public boolean add(E e) { return map.put(e, PRESENT) == null; }> Voimme huomata, että HashSet-luokan add()-metodi kutsuu sisäisesti laittaa() tapa tukea HashMap-objektia välittämällä elementti, jonka olet määrittänyt avaimeksi ja vakio PRESENT sen arvoksi. Poista() menetelmä toimii myös samalla tavalla. Se kutsuu sisäisesti karttaliittymän poistomenetelmää.
public boolean remove(Object o) { return map.remove(o) == PRESENT; }> HashSet ei vain tallenna ainutlaatuisia objekteja, vaan myös ainutlaatuisen objektikokoelman Kuten ArrayList , LinkedList , vektori .. jne.
HashSet-luokan rakentajat
HashSetin luomiseksi meidän on luotava HashSet-luokan objekti. HashSet-luokka koostuu erilaisista konstruktoreista, jotka mahdollistavat HashSetin luomisen. Seuraavat ovat tässä luokassa saatavilla olevat konstruktorit.
1. HashSet()
Tätä konstruktoria käytetään tyhjän HashSet-objektin rakentamiseen, jonka oletusarvoinen alkukapasiteetti on 16 ja oletuskuormituskerroin 0,75. Jos haluamme luoda tyhjän HashSetin nimellä hs, se voidaan luoda seuraavasti:
HashSet hs = new HashSet();>
2. HashSet(int alkuperäinen kapasiteetti)
Tätä rakentajaa käytetään tyhjän HashSet-objektin rakentamiseen, jossa alkuperäinen kapasiteetti on määritetty objektin luonnin yhteydessä. Tässä oletuslataustekijä on 0,75.
HashSet hs = new HashSet(int initialCapacity);>
3. HashSet(in alkuperäinen kapasiteetti, float loadFactor)
Tätä rakentajaa käytetään tyhjän HashSet-objektin rakentamiseen, jossa originalCapacity ja loadFactor määritetään objektin luonnin yhteydessä.
HashSet hs = new HashSet(int initialCapacity, float loadFactor);>
4. HashSet (kokoelma)
Tätä konstruktoria käytetään rakentamaan HashSet-objekti, joka sisältää kaikki elementit annetusta kokoelmasta. Lyhyesti sanottuna tätä konstruktoria käytetään, kun tarvitaan muunnos mistä tahansa Collection-objektista HashSet-objektiksi. Jos haluamme luoda HashSetin nimellä hs, se voidaan luoda seuraavasti:
HashSet hs = new HashSet(Collection C);>
Alla on yllä olevien aiheiden toteutus:
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());> >}> }> |
>
>Lähtö:
[South Africa, Australia, India] List contains India or not:true List after removing Australia:[South Africa, India] Iterating over list: South Africa India>
HashSetin menetelmät
| MENETELMÄ | KUVAUS |
|---|---|
| lisää (ja ja) | Käytetään määritetyn elementin lisäämiseen, jos sitä ei ole, jos se on läsnä, palauttaa epätosi. |
| asia selvä() | Käytetään kaikkien elementtien poistamiseen sarjasta. |
| sisältää (objekti o) | Käytetään palauttamaan tosi, jos elementti on joukossa. |
| poista (objekti o) | Käytetään elementin poistamiseen, jos se on sarjassa. |
| iteraattori() | Käytetään palauttamaan iteraattori joukon elementin päälle. |
| on tyhjä() | Käytetään tarkistamaan, onko sarja tyhjä vai ei. Palauttaa tosi tyhjälle ja epätosi joukon ei-tyhjälle ehdolle. |
| koko() | Käytetään palauttamaan sarjan koko. |
| klooni() | Käytetään luomaan matala kopio sarjasta. |
Erilaisten toimintojen suorittaminen HashSetillä
Katsotaanpa, kuinka suorittaa muutama usein käytetty toiminto HashSetissä.
1. Elementtien lisääminen HashSetissä
Elementin lisäämiseksi HashSetiin voimme käyttää add()-menetelmää . Lisäysjärjestystä ei kuitenkaan säilytetä HashSetissä. Meidän on pidettävä mielessä, että päällekkäiset elementit eivät ole sallittuja ja kaikki päällekkäiset elementit ohitetaan.
Esimerkki
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);> >}> }> |
>
>Lähtö:
HashSet elements : [Geek, For, Geeks]>
2. Elementtien poistaminen HashSetistä
Arvot voidaan poistaa HashSetistä käyttämällä remove()-menetelmää.
Esimerkki
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'>));> >}> }> |
silmukoille java
>
>Lähtö:
Initial HashSet [A, B, Geek, For, Geeks, Z] After removing element [A, Geek, For, Geeks, Z] Element AC exists in the Set : false>
3. Iterointi HashSetin kautta
Iteroi HashSet-elementtien läpi käyttämällä iterator()-menetelmää. Myös tunnetuin on käyttää parannettu silmukalle.
Esimerkki
Koodilohko
LähtöA, B, Geek, For, Geeks, Z, A, B, Geek, For, Geeks, Z,>
HashSet-toimintojen aika monimutkaisuus: HashSetin taustalla oleva tietorakenne on hashtable. Joten kuoleta (keskimääräinen tai tavallinen tapaus) aika monimutkaisuus HashSetin lisäys-, poisto- ja hakutoiminnon (sisältää menetelmän) aikana O(1) aika.
HashSetin suorituskyky
HashSet laajentaa Abstract Set -luokkaa ja toteuttaa Aseta , kloonattava ja Sarjasoitavissa rajapinnat, joissa E on tämän joukon ylläpitämien elementtien tyyppi. HashSetin suoraan tunnettu alaluokka on LinkedHashSet.
Nyt jatkuvan aikasuorituskyvyn ylläpitämiseksi iterointi HashSetin yli vaatii aikaa, joka on verrannollinen HashSet-ilmentymän koon (elementtien lukumäärä) ja taustalla olevan HashMap-esiintymän kapasiteetin (ämpärien lukumäärä) summaan. Siksi on erittäin tärkeää, että alkukapasiteettia ei aseteta liian korkeaksi (tai kuormituskerroin liian pieneksi), jos iterointisuorituskyky on tärkeää.
- Alkukapasiteetti: Alkukapasiteetti tarkoittaa segmenttien määrää, kun hashtable (HashSet käyttää sisäisesti hashtable-tietorakennetta) luodaan. Kauhojen lukumäärä kasvaa automaattisesti, jos nykyinen koko täyttyy.
- Kuormituskerroin: Kuormituskerroin on mitta siitä, kuinka täyteen HashSet saa tulla, ennen kuin sen kapasiteettia lisätään automaattisesti. Kun tiivistetaulukon merkintöjen määrä ylittää kuormituskertoimen ja nykyisen kapasiteetin tulon, tiivistetaulukko tiivistetään uudelleen (eli sisäiset tietorakenteet rakennetaan uudelleen) siten, että tiivistetaulukossa on noin kaksi kertaa enemmän ryhmiä.
Number of stored elements in the table Load Factor = ----------------------------------------- Size of the hash table>
Esimerkki: Jos sisäinen kapasiteetti on 16 ja kuormituskerroin 0,75, kauhojen lukumäärä kasvaa automaattisesti, kun taulukossa on 12 elementtiä.
Vaikutus suorituskykyyn:
Kuormituskerroin ja alkukapasiteetti ovat kaksi päätekijää, jotka vaikuttavat HashSet-toimintojen suorituskykyyn. Kuormituskerroin 0,75 tarjoaa erittäin tehokkaan suorituskyvyn ajan ja tilan monimutkaisuuden suhteen. Jos nostamme kuormituskertoimen arvoa tätä enemmän, muistin ylimäärä vähenee (koska se vähentää sisäistä uudelleenrakennustoimintoa), mutta se vaikuttaa lisäys- ja hakutoimintoihin hash-taulukossa. Rehash-operaation vähentämiseksi meidän tulee valita alkukapasiteetti viisaasti. Jos alkuperäinen kapasiteetti on suurempi kuin merkintöjen enimmäismäärä jaettuna latauskertoimella, uudelleentarkistustoimintoa ei koskaan tapahdu.
Huomautus: Toteutus HashSetissä ei ole synkronoitu siinä mielessä, että jos useat säikeet käyttävät hajautusjoukkoa samanaikaisesti ja ainakin yksi säikeistä muokkaa joukkoa, se on synkronoitava ulkoisesti. Tämä saavutetaan yleensä synkronoimalla jonkin kohteen kanssa, joka luonnollisesti kapseloi joukon. Jos tällaista objektia ei ole, joukko tulee kääriä Collections.synchronizedSet-menetelmällä. Tämä on parasta tehdä luomishetkellä, jotta vältetään vahingossa tapahtuva synkronoimaton pääsy sarjaan alla olevan kuvan mukaisesti:
Set s = Kokoelmat.synchronizedSet(new HashSet(…));
HashSetin kanssa käytetyt menetelmät
1. Luokasta java.util.AbstractSet perityt menetelmät
| Menetelmä | Kuvaus |
|---|---|
| on yhtä suuri () | Käytetään objektin ja HashSetin tasavertaisuuden tarkistamiseen ja niiden vertailuun. Lista palauttaa tosi vain, jos molemmat HashSet sisältävät samat elementit järjestyksestä riippumatta. |
| hash koodin() | Palauttaa tämän joukon hash-koodin arvon. |
| poista kaikki (kokoelma) | Tätä menetelmää käytetään poistamaan kokoelmasta kaikki joukossa olevat elementit. Tämä menetelmä palauttaa tosi, jos tämä joukko muuttuu kutsun seurauksena. |
2. Luokasta java.util.AbstractCollection perityt menetelmät
| MENETELMÄ | KUVAUS |
|---|---|
| addAll (kokoelma) | Tätä menetelmää käytetään liittämään kaikki elementit mainitusta kokoelmasta olemassa olevaan joukkoon. Elementit lisätään satunnaisesti noudattamatta mitään tiettyä järjestystä. |
| sisältääKaikki (kokoelma) | Tällä menetelmällä tarkistetaan, sisältääkö joukko kaikki annetussa kokoelmassa olevat elementit vai ei. Tämä menetelmä palauttaa tosi, jos joukko sisältää kaikki elementit, ja palauttaa epätosi, jos jokin elementeistä puuttuu. |
| säilyttää kaikki (kokoelma) | Tätä menetelmää käytetään säilyttämään kaikki joukon elementit, jotka on mainittu annetussa kokoelmassa. Tämä menetelmä palauttaa tosi, jos tämä joukko muuttui kutsun seurauksena. |
| toArray() | Tätä menetelmää käytetään muodostamaan taulukko samoista elementeistä kuin Joukko. |
| toString() | Java HashSetin menetelmää toString() käytetään palauttamaan HashSet-kokoelman elementtien merkkijonoesitys. |
3. Käyttöliittymässä java.util.Collection ilmoitetut menetelmät
| MENETELMÄ | KUVAUS |
|---|---|
| parallelStream() | Palauttaa mahdollisesti rinnakkaisen streamin, jonka lähteenä on tämä kokoelma. |
| Poista Jos? (Predikaattisuodatin) | Poistaa kaikki tämän kokoelman elementit, jotka täyttävät annetun predikaatin. |
| stream() | Palauttaa peräkkäisen streamin, jonka lähteenä on tämä kokoelma. |
| toArray?(IntFunction-generaattori) | Palauttaa taulukon, joka sisältää kaikki tämän kokoelman elementit, käyttämällä palautetun taulukon varaamiseen toimitettua generaattoritoimintoa. |
4. Käyttöliittymässä java.lang.Iterable ilmoitetut menetelmät
| MENETELMÄ | KUVAUS |
|---|---|
| jokaiselle? (kuluttajan toiminta) | Suorittaa annetun toiminnon kullekin iterable-elementille, kunnes kaikki elementit on käsitelty tai toiminto tekee poikkeuksen. |
5. Käyttöliittymässä java.util.Set ilmoitetut menetelmät
| MENETELMÄ | KUVAUS |
|---|---|
| Lisää kaikki? (kokoelma c) | Lisää kaikki määritetyn kokoelman elementit tähän joukkoon, jos niitä ei vielä ole (valinnainen toiminto). |
| sisältää kaikki? (kokoelma c) | Palauttaa tosi, jos tämä joukko sisältää kaikki määritetyn kokoelman elementit. |
| yhtä suuri? (Objekti o) | Vertaa määritettyä objektia tähän tasa-arvojoukkoon. |
| hash koodin() | Palauttaa tämän joukon hash-koodin arvon. |
| poistaa kaikki? (kokoelma c) | Poistaa tästä joukosta kaikki sen elementit, jotka sisältyvät määritettyyn kokoelmaan (valinnainen toiminto). |
| säilyttää kaikki? (kokoelma c) | Säilyttää vain tämän joukon elementit, jotka sisältyvät määritettyyn kokoelmaan (valinnainen toiminto). |
| toArray() | Palauttaa taulukon, joka sisältää kaikki tämän joukon elementit. |
| toArray?(T[] a) | Palauttaa taulukon, joka sisältää kaikki tämän joukon elementit; palautetun taulukon ajonaikainen tyyppi on määritetyn taulukon tyyppi. |
Usein kysytyt kysymykset HashSetissä Javassa
Q1. Mikä on HashSet Javassa?
Vastaus:
HashSet on eräänlainen luokka, joka laajentaa AbstractSet ja toteuttaa Set-rajapintoja.
Q2. Miksi HashSetiä käytetään?
Vastaus:
HashSetiä käytetään päällekkäisten tietojen välttämiseen ja arvon löytämiseen nopealla menetelmällä.
Q3. Erot HashSetin ja HashMapin välillä.
Vastaus:
| Perusta | HashSet | HashMap |
|---|---|---|
| Toteutus | HashSet toteuttaa Set-rajapinnan. | HashMap toteuttaa storesMap-käyttöliittymän. |
| Kopiot | HashSet ei salli päällekkäisiä arvoja. | HashMap tallentaa avain- ja arvoparit, eikä se salli päällekkäisiä avaimia. Jos avain on kaksoiskappale, vanha avain korvataan uudella arvolla. |
| Objektien lukumäärä objektien tallennuksen aikana | HashSet vaatii vain yhden objektin lisäyksen (Object o). | HashMap vaatii kahden objektin asettamisen (K-avain, V-arvo) elementin lisäämiseksi HashMap-objektiin. |
| Tyhjä arvo | HashSet käyttää sisäisesti HashMapia elementtien lisäämiseen. HashSetissä add(Object)-metodissa välitetty argumentti toimii avaimena K. Java liittää sisäisesti valearvon jokaiselle add(Object)-metodissa välitetylle arvolle. | HashMapilla ei ole mitään käsitettä valearvosta. |
| Mekanismin säilyttäminen tai lisääminen | HashSet käyttää sisäisesti HashMap-objektia objektien tallentamiseen tai lisäämiseen. | HashMap käyttää sisäisesti hajautusta objektien tallentamiseen tai lisäämiseen |
| Nopeammin | HashSet on hitaampi kuin HashMap. | HashMap on nopeampi kuin HashSet. |
| Lisäys | HashSet käyttää add()-menetelmää tietojen lisäämiseen tai tallentamiseen. | HashMap käyttää put()-menetelmää tietojen tallentamiseen. |
| Esimerkki | HashSet on joukko, esim. {1, 2, 3, 4, 5, 6, 7}. | HashMap on avain -> arvopari (avain arvoon) -kartta, esim. {a -> 1, b -> 2, c -> 2, d -> 1}. |
Q4. Erot HashSetin ja TreeSetin välillä Javassa.
Vastaus:
| Perusta | HashSet | TreeSet |
|---|---|---|
| Nopeus ja sisäinen toteuttaa, heittää toimintaa | Toimintoja, kuten hakua, lisäämistä ja poistamista varten. Näihin toimintoihin kuluu keskimäärin jatkuvasti aikaa. HashSet on nopeampi kuin TreeSet. HashSet toteutetaan hash-taulukon avulla. | TreeSet käyttää hakua, lisäämistä ja poistamista varten O(Log n), joka on suurempi kuin HashSet. Mutta TreeSet säilyttää lajitellut tiedot. Se tukee myös operaatioita, kuten high() (palauttaa vähiten korkeamman elementin), floor(), katto() jne. Nämä toiminnot ovat myös O(Log n) TreeSetissä, eikä niitä tueta HashSetissä. TreeSet on toteutettu käyttämällä itsetasapainottavaa binaarihakupuuta (puna-musta puu). TreeSetiä tukee TreeMap Javassa. |
| Tilaus | HashSetin elementtejä ei järjestetä. | TreeSet ylläpitää objektit lajiteltuna, joka on määritetty Javassa joko Comparable- tai Comparator-menetelmällä. TreeSet-elementit lajitellaan oletusarvoisesti nousevaan järjestykseen. Se tarjoaa useita menetelmiä tilatun joukon käsittelemiseksi, kuten first(), last(), headSet(), tailSet() jne. |
| Null Object | HashSet sallii nollaobjektin. | TreeSet ei salli null-objektia ja heittää NullPointerException, Why, johtuu siitä, että TreeSet käyttää vertailuTo()-menetelmää avaimien vertaamiseen, ja vertaa() heittää java.lang.NullPointerExceptionin. |
| Vertailu | HashSet käyttää equals()-menetelmää kahden joukon objektin vertaamiseen ja kaksoiskappaleiden havaitsemiseen. | TreeSet käyttää vertailuTo()-menetelmää samaan tarkoitukseen. Jos equals() ja vertaaTo() eivät ole johdonmukaisia, eli kahdelle samansuuruiselle objektille yhtäläisten pitäisi palauttaa true ja vertaa() palauttaa nolla, se rikkoo Set-liitännän sopimuksen ja sallii kaksoiskappaleet Set-toteutuksissa, kuten TreeSet. |