Java HashSet klasė įgyvendina Set sąsają, paremtą maišos lentele, kuri iš tikrųjų yra HashMap egzempliorius. Negarantuojama maišos rinkinių iteracijos tvarka, o tai reiškia, kad klasė negarantuoja pastovios elementų tvarkos laikui bėgant. Ši klasė leidžia naudoti nulinį elementą. Klasė taip pat siūlo nuolatinį pagrindinių operacijų, tokių kaip pridėjimas, pašalinimas, įtraukimas ir dydis, našumą, darant prielaidą, kad maišos funkcija tinkamai paskirsto elementus tarp kibirų, kuriuos pamatysime toliau straipsnyje.
„Java HashSet“ funkcijos
Toliau paminėtos kelios svarbios „HashSet“ funkcijos:
- Įgyvendina Nustatyti sąsają .
- Pagrindinė HashSet duomenų struktūra yra Hashtable .
- Kadangi ji įgyvendina Set Interface, pasikartojančios reikšmės neleidžiamos.
- Negarantuojama, kad objektai, kuriuos įterpiate į HashSet, bus įterpti ta pačia tvarka. Objektai įterpiami pagal jų maišos kodą.
- NULL elementai leidžiami HashSet.
- HashSet taip pat įgyvendina Serializuojama ir Galima klonuoti sąsajos.
HashSet deklaracija
public class HashSet extends AbstractSet implements Set, Cloneable, Serializable>
kur IR yra elementų tipas, saugomas HashSet.
HashSet Java pavyzdys
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());> >}> }> |
Linux pakeisti katalogo pavadinimą
>
>Išvestis:
1>
Prieš išsaugodama objektą, HashSet patikrina, ar yra įrašas, naudojant hashCode() ir equals() metodus. Aukščiau pateiktame pavyzdyje du sąrašai laikomi lygiais, jei juose yra tie patys elementai ta pačia tvarka. Kai kreipiatės į maišos kodas () metodą dviejuose sąrašuose, jie abu duos tą pačią maišą, nes yra vienodi.
Pastaba: HashSet daro nesaugokite pasikartojančių prekių , jei pateikiate du vienodus objektus, tada jis išsaugo tik pirmąjį, čia yra list1.
HashSet hierarchija yra tokia:
Vidinis maišos rinkinio veikimas
Visų „Set“ sąsajos klasių atsarginė kopija yra sukurta „Map“. „HashSet“ naudoja „HashMap“, kad saugotų savo objektą viduje. Jums tikriausiai įdomu, kad norėdami įvesti reikšmę į HashMap, mums reikia rakto ir reikšmių poros, tačiau HashSet perduodame tik vieną reikšmę.
„HashMap“ saugykla: Tiesą sakant, reikšmė, kurią įterpiame į HashSet, veikia kaip žemėlapio objekto raktas, o jo vertei java naudoja pastovų kintamąjį. Taigi rakto-reikšmių poroje visos reikšmės bus vienodos.
HashSet įdiegimas 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();> Jei pažiūrėtume į papildyti() HashSet klasės metodas:
public boolean add(E e) { return map.put(e, PRESENT) == null; }> Galime pastebėti, kad HashSet klasės metodas add() viduje iškviečia įdėti () HashMap objekto pagrindo metodas perduodant elementą, kurį nurodėte kaip raktą, ir konstantą PRESENT kaip jo reikšmę. pašalinti () metodas veikia taip pat. Jis viduje iškviečia žemėlapio sąsajos pašalinimo metodą.
public boolean remove(Object o) { return map.remove(o) == PRESENT; }> HashSet ne tik saugo unikalius objektus, bet ir unikalią objektų kolekciją Kaip ArrayList , LinkedList , vektorius ir kt.
HashSet klasės konstruktoriai
Norėdami sukurti HashSet, turime sukurti HashSet klasės objektą. HashSet klasė susideda iš įvairių konstruktorių, kurie leidžia sukurti HashSet. Toliau pateikiami šios klasės konstruktoriai.
1. HashSet()
Šis konstruktorius naudojamas tuščiam HashSet objektui sukurti, kurio numatytoji pradinė talpa yra 16, o numatytasis apkrovos koeficientas yra 0,75. Jei norime sukurti tuščią HashSet pavadinimu hs, tada jį galima sukurti kaip:
HashSet hs = new HashSet();>
2. HashSet (tarp pradinė talpa)
Šis konstruktorius naudojamas tuščiam HashSet objektui sukurti, kuriame objekto kūrimo metu nurodoma pradinė talpa. Čia numatytasis „loadFactor“ išlieka 0,75.
HashSet hs = new HashSet(int initialCapacity);>
3. HashSet (tarp pradinė talpa, float loadFactor)
Šis konstruktorius naudojamas tuščiam HashSet objektui sukurti, kuriame objekto kūrimo metu nurodomi inicialiniai pajėgumai ir loadFactor.
HashSet hs = new HashSet(int initialCapacity, float loadFactor);>
4. Maišos rinkinys (rinkinys)
Šis konstruktorius naudojamas sukurti HashSet objektą, kuriame yra visi elementai iš nurodytos kolekcijos. Trumpai tariant, šis konstruktorius naudojamas, kai reikia bet kokio Kolekcinio objekto konvertavimo į HashSet objektą. Jei norime sukurti HashSet pavadinimu hs, jį galima sukurti kaip:
HashSet hs = new HashSet(Collection C);>
Žemiau pateikiamas pirmiau minėtų temų įgyvendinimas:
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());> >}> }> |
>
>Išvestis:
[South Africa, Australia, India] List contains India or not:true List after removing Australia:[South Africa, India] Iterating over list: South Africa India>
HashSet metodai
| METODAS | APIBŪDINIMAS |
|---|---|
| pridėti (ir ir) | Naudojamas norint pridėti nurodytą elementą, jei jo nėra, jei jis yra, grąžinkite false. |
| aišku () | Naudojamas pašalinti visus elementus iš rinkinio. |
| yra (O objektas) | Naudojamas norint grąžinti „true“, jei elementas yra rinkinyje. |
| pašalinti (O objektas) | Naudojamas elementui pašalinti, jei jis yra rinkinyje. |
| iteratorius () | Naudojamas norint grąžinti iteratorių virš elemento rinkinyje. |
| Yra tuščias() | Naudojamas patikrinti, ar rinkinys tuščias, ar ne. Grąžina teisinga tuščiai ir false, jei rinkinio sąlyga nėra tuščia. |
| dydis () | Naudojamas rinkinio dydžiui grąžinti. |
| klonas () | Naudojamas sekliai rinkinio kopijai sukurti. |
Įvairių operacijų atlikimas su HashSet
Pažiūrėkime, kaip atlikti keletą dažnai naudojamų „HashSet“ operacijų.
1. Elementų įtraukimas į HashSet
Norėdami pridėti elementą prie HashSet, galime naudoti metodą add() . Tačiau įterpimo tvarka „HashSet“ neišlaikoma. Turime nepamiršti, kad pasikartojantys elementai neleidžiami ir visi pasikartojantys elementai yra ignoruojami.
Pavyzdys
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);> >}> }> |
>
>Išvestis:
HashSet elements : [Geek, For, Geeks]>
2. Elementų pašalinimas iš HashSet
Vertes galima pašalinti iš HashSet naudojant Remove() metodą.
Pavyzdys
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'>));> >}> }> |
>
>Išvestis:
Initial HashSet [A, B, Geek, For, Geeks, Z] After removing element [A, Geek, For, Geeks, Z] Element AC exists in the Set : false>
3. Iteravimas per HashSet
Pakartokite HashSet elementus naudodami iterator() metodą. Be to, garsiausias yra naudoti patobulinta kilpai.
Pavyzdys
Kodo blokas
IšvestisA, B, Geek, For, Geeks, Z, A, B, Geek, For, Geeks, Z,>
HashSet operacijų laiko sudėtingumas: Pagrindinė HashSet duomenų struktūra yra su maiša. Taigi amortizuokite (vidutinį ar įprastą atvejį) laiko sudėtingumą, kad pridėtumėte, pašalintumėte ir ieškotumėte (yra metodas) HashSet operacijos trukmė O(1) laikas.
„HashSet“ našumas
HashSet išplečia abstrakčių rinkinių klasę ir padargai Nustatyti , Klonuojamas ir Serializuojama sąsajos, kur E yra šio rinkinio palaikomų elementų tipas. Tiesiogiai žinomas HashSet poklasis yra LinkedHashSet .
Dabar, norint išlaikyti pastovų laiko našumą, kartojimui per HashSet reikia laiko, proporcingo HashSet egzemplioriaus dydžio sumai (elementų skaičiui) ir pagalbinio HashMap egzemplioriaus talpai (segmentų skaičiui). Taigi, labai svarbu nenustatyti per didelės pradinės talpos (arba per mažo apkrovos koeficiento), jei svarbus iteracijos našumas.
- Pradinė talpa: Pradinė talpa reiškia segmentų skaičių, kai sukuriama maišos lentelė (HashSet viduje naudoja maišos duomenų struktūrą). Kaušelių skaičius bus automatiškai padidintas, jei dabartinis dydis bus pilnas.
- Apkrovos koeficientas: Apkrovos koeficientas yra matas, nurodantis, kiek „HashSet“ leidžiama užpildyti prieš automatiškai padidinant jo talpą. Kai maišos lentelės įrašų skaičius viršija apkrovos koeficiento ir dabartinės talpos sandaugą, maišos lentelės maišos talpa yra pertvarkyta (ty vidinės duomenų struktūros perkuriamos), kad maišos lentelėje būtų maždaug dvigubai daugiau segmentų.
Number of stored elements in the table Load Factor = ----------------------------------------- Size of the hash table>
Pavyzdys: Jei vidinė talpa yra 16, o apkrovos koeficientas yra 0,75, tada kaušų skaičius automatiškai padidės, kai lentelėje bus 12 elementų.
Poveikis našumui:
Apkrovos koeficientas ir pradinė talpa yra du pagrindiniai veiksniai, turintys įtakos HashSet operacijų veikimui. 0,75 apkrovos koeficientas užtikrina labai efektyvų veikimą, atsižvelgiant į laiko ir erdvės sudėtingumą. Jei padidinsime apkrovos faktoriaus reikšmę daugiau, tada atminties viršija bus sumažinta (nes sumažės vidinė atkūrimo operacija), tačiau tai turės įtakos pridėjimo ir paieškos operacijoms maišos lentelėje. Norėdami sumažinti pakartotinio atkūrimo operaciją, turėtume protingai pasirinkti pradinį pajėgumą. Jei pradinis pajėgumas yra didesnis nei maksimalus įrašų skaičius, padalytas iš apkrovos koeficiento, pertvarkymo operacija niekada nebus atlikta.
Pastaba: Diegimas maišos rinkinyje nėra sinchronizuojamas ta prasme, kad jei kelios gijos vienu metu pasiekia maišos rinkinį ir bent viena iš gijų pakeičia rinkinį, ji turi būti sinchronizuojama išoriškai. Tai paprastai pasiekiama sinchronizuojant su kokiu nors objektu, kuris natūraliai apima rinkinį. Jei tokio objekto nėra, rinkinys turėtų būti apvyniotas naudojant Collections.synchronizedSet metodą. Tai geriausia padaryti kūrimo metu, kad būtų išvengta atsitiktinės nesinchronizuotos prieigos prie rinkinio, kaip parodyta toliau:
Set s = Collections.synchronizedSet(new HashSet(...));
Su HashSet naudojami metodai
1. Metodai, paveldėti iš klasės java.util.AbstractSet
| Metodas | apibūdinimas |
|---|---|
| lygus () | Naudojamas objekto lygumui su HashSet patikrinti ir juos palyginti. Sąrašas grąžinamas tik tuo atveju, jei abiejuose „HashSet“ yra tie patys elementai, neatsižvelgiant į tvarką. |
| maišos kodas () | Grąžina šio rinkinio maišos kodo reikšmę. |
| pašalinti viską (kolekcija) | Šis metodas naudojamas pašalinti iš kolekcijos visus rinkinyje esančius elementus. Šis metodas grąžina teisingą, jei šis rinkinys pasikeičia dėl iškvietimo. |
2. Metodai, paveldėti iš klasės java.util.AbstractCollection
| METODAS | APIBŪDINIMAS |
|---|---|
| pridėti viską (kolekcija) | Šis metodas naudojamas visiems elementams iš minėtos kolekcijos pridėti prie esamo rinkinio. Elementai pridedami atsitiktinai, nesilaikant jokios konkrečios tvarkos. |
| yra viskas (kolekcija) | Šis metodas naudojamas patikrinti, ar rinkinyje yra visi elementai, esantys duotoje kolekcijoje, ar ne. Šis metodas grąžina „true“, jei rinkinyje yra visi elementai, ir grąžina „false“, jei kurio nors iš elementų trūksta. |
| išlaikyti viską (kolekcija) | Šis metodas naudojamas norint išsaugoti visus rinkinio elementus, kurie paminėti duotoje kolekcijoje. Šis metodas grąžina teisingą, jei šis rinkinys pasikeitė dėl iškvietimo. |
| toArray () | Šis metodas naudojamas formuoti masyvą iš tų pačių elementų kaip ir rinkinio. |
| toString() | Java HashSet metodas toString() naudojamas grąžinti HashSet kolekcijos elementų eilutę. |
3. Metodai, deklaruoti sąsajoje java.util.Collection
| METODAS | APIBŪDINIMAS |
|---|---|
| parallelStream() | Pateikiamas galbūt lygiagretus srautas, kurio šaltinis yra ši kolekcija. |
| RemoveIf? (Predikatinis filtras) | Pašalina visus šio rinkinio elementus, kurie atitinka nurodytą predikatą. |
| srautas() | Pateikia nuoseklų srautą, kurio šaltinis yra ši kolekcija. |
| toArray? (IntFunction generatorius) | Grąžina masyvą, kuriame yra visi šios kolekcijos elementai, naudojant pateiktą generatoriaus funkciją grąžintam masyvui paskirstyti. |
4. Metodai, deklaruoti sąsajoje java.lang.Iterable
| METODAS | APIBŪDINIMAS |
|---|---|
| už kiekvieną? (vartotojo veiksmas) | Atlieka nurodytą veiksmą kiekvienam Iterable elementui, kol visi elementai bus apdoroti arba veiksmas padarys išimtį. |
5. Metodai, nurodyti sąsajoje java.util.Set
| METODAS | APIBŪDINIMAS |
|---|---|
| pridėti viską? (C rinkinys) | Prideda visus nurodytos kolekcijos elementus prie šio rinkinio, jei jų dar nėra (pasirenkama operacija). |
| yra viskas? (C rinkinys) | Grąžina true, jei šiame rinkinyje yra visi nurodyto rinkinio elementai. |
| lygus? (O objektas) | Lygina nurodytą objektą su šiuo lygybės rinkiniu. |
| maišos kodas () | Grąžina šio rinkinio maišos kodo reikšmę. |
| pašalinti viską? (C rinkinys) | Iš šio rinkinio pašalinami visi jo elementai, esantys nurodytoje kolekcijoje (pasirenkama operacija). |
| išlaikyti viską? (C rinkinys) | Išsaugo tik šio rinkinio elementus, kurie yra nurodytame rinkinyje (pasirenkama operacija). |
| toArray () | Grąžina masyvą, kuriame yra visi šio rinkinio elementai. |
| to Array? (T[] a) | Grąžina masyvą, kuriame yra visi šio rinkinio elementai; grąžinamo masyvo vykdymo laikas yra nurodyto masyvo tipas. |
DUK „HashSet“ programoje „Java“.
Q1. Kas yra „HashSet“ programoje „Java“?
Atsakymas:
HashSet yra klasės tipas, kuris išplečia AbstractSet ir įgyvendina Set sąsajas.
Q2. Kodėl naudojamas HashSet?
Atsakymas:
„HashSet“ naudojamas norint išvengti duomenų pasikartojimo ir surasti vertę naudojant greitą metodą.
Q3. „HashSet“ ir „HashMap“ skirtumai.
Atsakymas:
| Pagrindas 15 iš 100,00 | HashSet | HashMap |
|---|---|---|
| Įgyvendinimas | „HashSet“ įgyvendina „Set“ sąsają. | HashMap įgyvendina storesMap sąsają. |
| Pasikartoja | HashSet neleidžia pasikartojančių verčių. | „HashMap“ saugo raktų ir reikšmių poras ir neleidžia pasikartoti raktų. Jei raktas yra dublikatas, senasis raktas pakeičiamas nauja reikšme. |
| Objektų skaičius objektų saugojimo metu | „HashSet“ reikalauja tik vieno objekto pridėjimo (Object o). | Norint pridėti elementą prie HashMap objekto, HashMap reikia įdėti du objektus (K raktas, V reikšmė). |
| Manekeno vertė | „HashSet“ viduje naudoja „HashMap“, kad pridėtų elementus. „HashSet“ metodu „add(Object)“ perduodamas argumentas naudojamas kaip raktas K. „Java“ viduje susieja fiktyviąją vertę kiekvienai reikšmei, perduotai metodu „add(Object)“. | HashMap neturi jokios fiktyvios vertės sąvokos. |
| Mechanizmo saugojimas arba pridėjimas | HashSet viduje naudoja HashMap objektą objektams saugoti arba pridėti. | „HashMap“ viduje naudoja maišą objektams saugoti arba pridėti |
| Greičiau | „HashSet“ yra lėtesnis nei „HashMap“. | „HashMap“ yra greitesnis nei „HashSet“. |
| Įdėjimas | HashSet naudoja add() metodą duomenims pridėti arba saugoti. | HashMap duomenų saugojimui naudoja put() metodą. |
| Pavyzdys | HashSet yra rinkinys, pvz. {1, 2, 3, 4, 5, 6, 7}. | HashMap yra raktas -> vertės poros (raktas į vertę) žemėlapis, pvz. {a -> 1, b -> 2, c -> 2, d -> 1}. |
4 klausimas. „HashSet“ ir „TreeSet“ skirtumai Java.
Atsakymas:
| Pagrindas | HashSet | Medžių rinkinys |
|---|---|---|
| Greitis ir vidinis įgyvendinti, mesti veiksmus | Atliekant tokias operacijas kaip paieška, įterpimas ir ištrynimas. Šioms operacijoms vidutiniškai reikia pastovaus laiko. HashSet yra greitesnis nei TreeSet. HashSet yra įdiegtas naudojant maišos lentelę. | „TreeSet“ paieškai, įterpimui ir ištrynimui naudoja O(Log n), kuris yra didesnis nei „HashSet“. Tačiau „TreeSet“ saugo surūšiuotus duomenis. Be to, ji palaiko tokias operacijas kaip high() (pateikia mažiausiai aukštesnį elementą), floor(), lubos() ir kt. Šios operacijos taip pat yra O(Log n) TreeSet ir nepalaikomos HashSet. TreeSet yra įdiegtas naudojant savaiminio balansavimo dvejetainį paieškos medį (raudoną-juodą medį). „TreeSet“ palaiko „TreeMap“ Java. |
| Užsakymas | „HashSet“ elementai nėra užsakyti. | „TreeSet“ palaiko objektus surūšiuota tvarka, apibrėžta „Java“ palyginimo arba palyginimo metodu. TreeSet elementai pagal numatytuosius nustatymus rūšiuojami didėjančia tvarka. Jame siūlomi keli būdai, kaip elgtis su užsakytu rinkiniu, pvz., pirmasis (), paskutinis (), headSet (), tailSet () ir kt. |
| Nulinis objektas | HashSet leidžia nulinį objektą. | TreeSet neleidžia nulinio objekto ir išmeta NullPointerException, Why, nes TreeSet naudoja palyginimo() metodą, kad palygintų raktus, o palyginimas() išmes java.lang.NullPointerException. |
| Palyginimas | HashSet naudoja equals() metodą, kad palygintų du rinkinio objektus ir aptiktų dublikatus. | „TreeSet“ tam pačiam tikslui naudoja palyginimo() metodą. Jei lygis() ir palygintiTo() nesuderinami, t. y. dviejų vienodų objektų vertė turi grąžinti true, o palygintiTo() turėtų grąžinti nulį, tai nutrauks Set sąsajos sutartį ir leis kopijuoti rinkinio diegimus, pvz., TreeSet. |