Java HashSet klase ievieš Set interfeisu, ko atbalsta hash tabula, kas faktiski ir HashMap instance. Nav garantijas par jaucējkopu iterācijas secību, kas nozīmē, ka klase negarantē nemainīgu elementu secību laika gaitā. Šī klase pieļauj nulles elementu. Klase piedāvā arī pastāvīgu laika veiktspēju pamata darbībām, piemēram, pievienošanai, noņemšanai, saturam un izmēram, pieņemot, ka jaucējfunkcija pareizi izkliedē elementus starp segmentiem, ko mēs redzēsim tālāk rakstā.
Java HashSet funkcijas
Tālāk ir minētas dažas svarīgas HashSet funkcijas:
- Īsteno Iestatīt interfeisu .
- HashSet pamatā esošā datu struktūra ir Hashtable .
- Tā kā tas ievieš Set Interface, vērtību dublikāti nav atļauti.
- Objekti, kurus ievietojat HashSet, netiek garantēti, ka tiks ievietoti tādā pašā secībā. Objekti tiek ievietoti, pamatojoties uz to jaucējkodu.
- HashSet ir atļauti NULL elementi.
- HashSet arī ievieš Serializējams un Klonējams saskarnes.
HashSet deklarācija
public class HashSet extends AbstractSet implements Set, Cloneable, Serializable>
kur UN ir HashSet saglabāto elementu veids.
HashSet Java piemērs
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());> >}> }> |
virkne tukša
>
>Izvade:
1>
Pirms objekta saglabāšanas, HashSet pārbauda, vai pastāv esošs ieraksts, izmantojot metodes hashCode() un equals(). Iepriekš minētajā piemērā divi saraksti tiek uzskatīti par vienādiem, ja tiem ir vienādi elementi tādā pašā secībā. Kad jūs izsaucat hashCode() metodi abos sarakstos, tie abi dotu vienu un to pašu jaucēju, jo tie ir vienādi.
Piezīme: HashSet dara neuzglabājiet dublētus vienumus , ja jūs piešķirat divus vienādus objektus, tas saglabā tikai pirmo, šeit tas ir saraksts1.
HashSet hierarhija ir šāda:
HashSet iekšējā darbība
Visas Set interfeisa klases tiek iekšēji dublētas pakalpojumā Map. HashSet izmanto HashMap sava objekta iekšējai glabāšanai. Jums noteikti jābrīnās, ka, lai ievadītu vērtību HashMap, mums ir nepieciešams atslēgas-vērtības pāris, bet HashSet mēs nododam tikai vienu vērtību.
Uzglabāšana HashMap: Faktiski vērtība, ko ievietojam HashSet, darbojas kā kartes objekta atslēga, un tās vērtībai Java izmanto nemainīgu mainīgo. Tātad atslēgas vērtību pārī visas vērtības būs vienādas.
HashSet ieviešana 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();> Ja mēs skatāmies uz pievienot () HashSet klases metode:
public boolean add(E e) { return map.put(e, PRESENT) == null; }> Varam pamanīt, ka HashSet klases metode add() iekšēji izsauc likt () metode HashMap objekta atbalstam, nododot elementu, kuru esat norādījis kā atslēgu un konstanti PRESENT kā tā vērtību. noņemt () metode darbojas arī tādā pašā veidā. Tā iekšēji izsauc kartes saskarnes noņemšanas metodi.
public boolean remove(Object o) { return map.remove(o) == PRESENT; }> HashSet ne tikai saglabā unikālus objektus, bet arī unikālu objektu kolekciju patīk ArrayList , LinkedList , vektors,... utt.
HashSet klases konstruktori
Lai izveidotu HashSet, mums ir jāizveido HashSet klases objekts. HashSet klase sastāv no dažādiem konstruktoriem, kas ļauj izveidot iespējamu HashSet. Tālāk ir norādīti šajā klasē pieejamie konstruktori.
1. HashSet()
Šis konstruktors tiek izmantots, lai izveidotu tukšu HashSet objektu, kura noklusējuma sākotnējā ietilpība ir 16 un noklusējuma slodzes koeficients ir 0,75. Ja vēlamies izveidot tukšu HashSet ar nosaukumu hs, tad to var izveidot kā:
HashSet hs = new HashSet();>
2. HashSet (sākotnējā ietilpība)
Šis konstruktors tiek izmantots, lai izveidotu tukšu HashSet objektu, kurā sākotnējāCapacity ir norādīta objekta izveides laikā. Šeit noklusējuma loadFactor paliek 0,75.
HashSet hs = new HashSet(int initialCapacity);>
3. HashSet (sākotnējā ietilpība, peldošā slodzes koeficients)
Šis konstruktors tiek izmantots, lai izveidotu tukšu HashSet objektu, kurā objekta izveides laikā ir norādīti inicializācijas kapacitāte un loadFactor.
HashSet hs = new HashSet(int initialCapacity, float loadFactor);>
4. HashSet (kolekcija)
Šis konstruktors tiek izmantots, lai izveidotu HashSet objektu, kurā ir visi elementi no dotās kolekcijas. Īsāk sakot, šis konstruktors tiek izmantots, ja ir nepieciešama pārveidošana no jebkura kolekcijas objekta uz HashSet objektu. Ja vēlamies izveidot HashSet ar nosaukumu hs, to var izveidot kā:
HashSet hs = new HashSet(Collection C);>
Tālāk ir norādīta iepriekš minēto tēmu īstenošana:
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());> >}> }> |
>
>Izvade:
[South Africa, Australia, India] List contains India or not:true List after removing Australia:[South Africa, India] Iterating over list: South Africa India>
Metodes HashSet
| METODE | APRAKSTS |
|---|---|
| pievienot (un un) | Izmanto, lai pievienotu norādīto elementu, ja tā nav, ja tas ir, atgriež false. |
| skaidrs () | Izmanto visu elementu noņemšanai no komplekta. |
| satur (Objekts o) | Izmanto, lai atgrieztu patiesu, ja komplektā atrodas elements. |
| noņemt (Objekts o) | Izmanto, lai noņemtu elementu, ja tas ir komplektā. |
| iterators () | Izmanto, lai atgrieztu iteratoru virs elementa komplektā. |
| ir tukšs() | Izmanto, lai pārbaudītu, vai komplekts ir tukšs. Atgriež “true” tukšam un “false” komplekta nosacījumam, kas nav tukšs. |
| Izmērs() | Izmanto, lai atgrieztu komplekta izmēru. |
| klons () | Izmanto, lai izveidotu seklu komplekta kopiju. |
Dažādu operāciju veikšana ar HashSet
Apskatīsim, kā ar HashSet veikt dažas bieži izmantotās darbības.
1. Elementu pievienošana HashSet
Lai pievienotu elementu HashSet, mēs varam izmantot add() metodi. Tomēr ievietošanas secība netiek saglabāta HashSet. Mums ir jāņem vērā, ka elementu dublikāti nav atļauti un visi dublētie elementi tiek ignorēti.
Piemērs
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);> >}> }> |
>
>Izvade:
HashSet elements : [Geek, For, Geeks]>
2. Elementu noņemšana no HashSet
Vērtības var noņemt no HashSet, izmantojot metodi remove().
Piemērs
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'>));> >}> }> |
Internetbankas trūkumi
>
>Izvade:
Initial HashSet [A, B, Geek, For, Geeks, Z] After removing element [A, Geek, For, Geeks, Z] Element AC exists in the Set : false>
3. Atkārtošana, izmantojot HashSet
Atkārtojiet HashSet elementus, izmantojot iterator() metodi. Arī slavenākais ir izmantot uzlabota cilpai.
Piemērs
Koda bloks
IzvadeA, B, Geek, For, Geeks, Z, A, B, Geek, For, Geeks, Z,>
HashSet operāciju laika sarežģītība: HashSet pamatā esošā datu struktūra ir hashtable. Tātad amortizējiet (vidējo vai parasto gadījumu) laika sarežģītību HashSet pievienošanai, noņemšanai un meklēšanai (satur metodi). O(1) laiks.
HashSet veiktspēja
HashSet paplašina Abstract Set klasi un rīkus Iestatīt , Klonējams un Serializējams saskarnes, kur E ir šīs kopas uzturēto elementu veids. Tieši zināmā HashSet apakšklase ir LinkedHashSet.
Tagad, lai uzturētu nemainīgu laika veiktspēju, iterācijai, izmantojot HashSet, ir nepieciešams laiks, kas ir proporcionāls HashSet instances lieluma summai (elementu skaitam) plus papildu HashMap instances kapacitātei (sepļu skaitam). Tāpēc ir ļoti svarīgi neuzstādīt pārāk augstu sākotnējo jaudu (vai pārāk zemu slodzes koeficientu), ja iterācijas veiktspēja ir svarīga.
- Sākotnējā jauda: Sākotnējā ietilpība nozīmē segmentu skaitu, kad tiek izveidots hashtable (HashSet iekšēji izmanto hashtable datu struktūru). Kausu skaits tiks automātiski palielināts, ja pašreizējais izmērs būs pilns.
- Slodzes koeficients: Slodzes koeficients ir rādītājs, kas parāda, cik pilna HashSet ir atļauta, pirms tā jauda tiek automātiski palielināta. Ja ierakstu skaits jaukšanas tabulā pārsniedz slodzes faktora un pašreizējās ietilpības reizinājumu, jaukšanas tabula tiek atkārtoti sajaukta (tas ir, tiek pārbūvētas iekšējās datu struktūras), lai jaukšanas tabulā būtu aptuveni divreiz vairāk segmentu.
Number of stored elements in the table Load Factor = ----------------------------------------- Size of the hash table>
Piemērs: Ja iekšējā ietilpība ir 16 un slodzes koeficients ir 0,75, tad kausu skaits automātiski palielinās, kad tabulā būs 12 elementi.
Ietekme uz veiktspēju:
Slodzes faktors un sākotnējā jauda ir divi galvenie faktori, kas ietekmē HashSet darbību veiktspēju. Slodzes koeficients 0,75 nodrošina ļoti efektīvu veiktspēju attiecībā uz laika un telpas sarežģītību. Ja mēs palielināsim slodzes faktora vērtību vairāk, tad atmiņas pieskaitāmās izmaksas tiks samazinātas (jo tas samazinās iekšējo atjaunošanas darbību), bet tas ietekmēs pievienošanas un meklēšanas darbību jaucējtabulā. Lai samazinātu atkārtotas atjaunošanas darbību, mums saprātīgi jāizvēlas sākotnējā jauda. Ja sākotnējā ietilpība ir lielāka par maksimālo ierakstu skaitu, kas dalīts ar slodzes koeficientu, atkārtotas jaukšanas darbība nekad nenotiks.
Piezīme: Ieviešana HashSet nav sinhronizēta tādā nozīmē, ka, ja vairāki pavedieni vienlaikus piekļūst jaucējkopai un vismaz viens no pavedieniem modificē kopu, tas ir jāsinhronizē ārēji. To parasti panāk, sinhronizējot ar kādu objektu, kas dabiski iekapsulē komplektu. Ja šāda objekta nav, kopa ir jāiesaiņo, izmantojot metodi Collections.synchronizedSet. To vislabāk var izdarīt izveides laikā, lai novērstu nejaušu nesinhronizētu piekļuvi kopai, kā parādīts tālāk:
Set s = Collections.synchronizedSet(new HashSet(…));
Ar HashSet izmantotās metodes
1. No klases java.util.AbstractSet mantotās metodes
| Metode | Apraksts |
|---|---|
| vienāds () | Izmanto, lai pārbaudītu objekta vienlīdzību ar HashSet un salīdzinātu tos. Saraksts atgriež patieso vērtību tikai tad, ja abās HashSet ir vienādi elementi neatkarīgi no secības. |
| hashcode () | Atgriež šīs kopas jaucējkoda vērtību. |
| noņemt visu (kolekcija) | Šo metodi izmanto, lai no kolekcijas noņemtu visus komplektā esošos elementus. Šī metode atgriež patieso vērtību, ja šī kopa mainās izsaukuma rezultātā. |
2. Metodes, kas mantotas no klases java.util.AbstractCollection
| METODE | APRAKSTS |
|---|---|
| pievienot visu (kolekcija) | Šo metodi izmanto, lai esošajai kopai pievienotu visus elementus no minētās kolekcijas. Elementi tiek pievienoti nejauši, neievērojot īpašu secību. |
| satur visu (kolekcija) | Šo metodi izmanto, lai pārbaudītu, vai komplektā ir visi dotajā kolekcijā esošie elementi. Šī metode atgriež vērtību “true”, ja komplektā ir visi elementi, un atgriež vērtību “false”, ja trūkst kāda no elementiem. |
| paturēt visu (kolekcija) | Šo metodi izmanto, lai saglabātu visus elementus no kopas, kas ir minēti dotajā kolekcijā. Šī metode atgriež patieso vērtību, ja šī kopa ir mainīta izsaukuma rezultātā. |
| toArray() | Šo metodi izmanto, lai izveidotu masīvu no tādiem pašiem elementiem kā komplektā. |
| toString() | Java HashSet metode toString() tiek izmantota, lai atgrieztu HashSet kolekcijas elementu virknes attēlojumu. |
3. Interfeisā java.util.Collection deklarētās metodes
| METODE | APRAKSTS |
|---|---|
| parallelStream() | Atgriež, iespējams, paralēlu straumi, kuras avots ir šī kolekcija. |
| RemoveIf? (Predikātu filtrs) | Noņem visus šīs kolekcijas elementus, kas atbilst norādītajam predikātam. |
| straume () | Atgriež secīgu straumi, kuras avots ir šī kolekcija. |
| toArray? (IntFunction ģenerators) | Atgriež masīvu, kurā ir visi šīs kolekcijas elementi, izmantojot nodrošināto ģeneratora funkciju, lai piešķirtu atgriezto masīvu. |
4. Interfeisā java.lang.Iterable deklarētās metodes
| METODE | APRAKSTS |
|---|---|
| par katru? (Patērētāja rīcība) | Veic norādīto darbību katram iterable elementam, līdz visi elementi ir apstrādāti vai darbība rada izņēmumu. |
5. Interfeisā java.util.Set deklarētās metodes
| METODE | APRAKSTS |
|---|---|
| pievienot visu? (C kolekcija) | Pievieno šai kopai visus norādītās kolekcijas elementus, ja tie vēl nav pieejami (neobligāta darbība). |
| satur visu? (C kolekcija) | Atgriež vērtību True, ja šajā kopā ir visi norādītās kolekcijas elementi. |
| vienāds? (Objekts o) | Salīdzina norādīto objektu ar šo vienlīdzības kopu. |
| hashCode() | Atgriež šīs kopas jaucējkoda vērtību. |
| noņemt visu? (C kolekcija) | No šīs kopas tiek noņemti visi tās elementi, kas atrodas norādītajā kolekcijā (neobligāta darbība). |
| paturēt visu? (C kolekcija) | Saglabā tikai tos šīs kopas elementus, kas ir ietverti norādītajā kolekcijā (neobligāta darbība). |
| toArray() | Atgriež masīvu, kurā ir visi šīs kopas elementi. |
| toArray?(T[] a) | Atgriež masīvu, kurā ir visi šīs kopas elementi; atgrieztā masīva izpildlaika veids ir norādītā masīva izpildlaika veids. |
Bieži uzdotie jautājumi Java programmā HashSet
Q1. Kas ir HashSet Java?
Atbilde:
HashSet ir klases veids, kas paplašina AbstractSet un ievieš Set saskarnes.
Q2. Kāpēc tiek izmantots HashSet?
Atbilde:
HashSet tiek izmantots, lai izvairītos no datu dublikātiem un atrastu vērtību ar ātro metodi.
Q3. Atšķirības starp HashSet un HashMap.
Atbilde:
| Pamats | HashSet | HashMap |
|---|---|---|
| Īstenošana | HashSet ievieš Set saskarni. | HashMap ievieš storesMap saskarni. |
| Dublikāti | HashSet neatļauj dublēt vērtības. | HashMap saglabā atslēgu un vērtību pārus un neatļauj dublēt atslēgas. Ja atslēga ir dublēta, vecā atslēga tiek aizstāta ar jauno vērtību. |
| Objektu skaits objektu uzglabāšanas laikā | HashSet prasa tikai vienu objekta pievienošanu (Object o). | Lai HashMap objektam pievienotu elementu, HashMap ir jāievieto divi objekti (K atslēga, V vērtība). |
| Manekena vērtība | HashSet iekšēji izmanto HashMap, lai pievienotu elementus. HashSet metodē add(Object) nodotais arguments kalpo kā atslēga K. Java iekšēji saista fiktīvu vērtību katrai vērtībai, kas nodota metodē add(Object). | HashMap nav fiktīvas vērtības jēdziena. |
| Mehānisma uzglabāšana vai pievienošana | HashSet iekšēji izmanto HashMap objektu, lai saglabātu vai pievienotu objektus. | HashMap iekšēji izmanto jaukšanu, lai saglabātu vai pievienotu objektus |
| Ātrāk | HashSet ir lēnāks nekā HashMap. | HashMap ir ātrāks par HashSet. |
| Ievietošana | HashSet datu pievienošanai vai glabāšanai izmanto metodi add(). | HashMap datu glabāšanai izmanto metodi put(). |
| Piemērs | HashSet ir kopa, piem. {1, 2, 3, 4, 5, 6, 7}. | HashMap ir atslēga -> vērtību pāra (atslēga uz vērtību) karte, piem. {a -> 1, b -> 2, c -> 2, d -> 1}. |
Q4. Atšķirības starp HashSet un TreeSet Java.
Atbilde:
| Pamats | HashSet | TreeSet |
|---|---|---|
| Ātrums un iekšējā īstenot, mest darbību | Tādām darbībām kā meklēšana, ievietošana un dzēšana. Vidēji šīm darbībām ir nepieciešams pastāvīgs laiks. HashSet ir ātrāks nekā TreeSet. HashSet tiek ieviests, izmantojot hash tabulu. | TreeSet meklēšanai, ievietošanai un dzēšanai izmanto O(Log n), kas ir augstāks par HashSet. Bet TreeSet saglabā sakārtotus datus. Tas atbalsta arī tādas darbības kā high () (atgriež vismaz augstāko elementu), floor (), griesti () utt. Šīs darbības ir arī O (Log n) TreeSet un netiek atbalstītas HashSet. TreeSet tiek ieviests, izmantojot pašbalansējošu bināro meklēšanas koku (sarkano-melno koku). TreeSet Java atbalsta TreeMap. |
| Pasūtīšana | HashSet elementi nav sakārtoti. | TreeSet uztur objektus sakārtotā secībā, ko Java definē vai nu salīdzināmā, vai salīdzinājuma metode. TreeSet elementi pēc noklusējuma tiek kārtoti augošā secībā. Tas piedāvā vairākas metodes, kā rīkoties ar pasūtīto kopu, piemēram, pirmais (), pēdējais (), headSet (), tailSet () utt. |
| Null objekts | HashSet atļauj nulles objektu. | TreeSet neatļauj null Object un izmet NullPointerException, Why, jo TreeSet izmanto metodi salīdzinātTo() atslēgu salīdzināšanai, un salīdzinātTo() izmet java.lang.NullPointerException. |
| Salīdzinājums | HashSet izmanto metodi equals(), lai salīdzinātu divus komplektā esošos objektus un noteiktu dublikātus. | TreeSet tam pašam mērķim izmanto metodi salīdzinātTo(). Ja vienāds() un salīdzinātTo() nav konsekventi, t.i., diviem vienādiem objektiem vienādiem ir jāatgriež patiess, savukārt salīdzinātTo() jāatgriež nulle, tas pārkāps Set interfeisa līgumu un atļaus dublikātus Set implementācijās, piemēram, TreeSet. |