logo

HashSet Java

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

Izvade

A, 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.