ebben a bejegyzésben meglátjuk, hogyan működik a HashSet belsőleg a Java-ban, ami szintén favoritejava gyűjtemények interjúkérdés, de mielőtt a Hashset belső megvalósításába lépne a Java-ban, fontos tudni két pontot a HashSet-ről.
- a Java HashSet csak egyedi értékeket tárol, azaz nem engedélyezettek másolatok.
- a HashSet ugyanúgy működik a hash fogalmán, mint a HashMap a Java-ban, de működése a következő módon különbözik a HashMap-től –
- HashMap-ben hozzáadunk egy (kulcs, érték) párt, és a hash függvényt kulcs segítségével számítjuk ki.
- ahol a HashSet hash függvényt maga az érték felhasználásával számítják ki. Megjegyezzük, hogy a HashSet wehave add (E e) módszer, amely úgy csak az elemet kell hozzáadni paraméterként.
is lehet, hogy kitalálta már, mivel hash függvény segítségével számítjuk érték ezért csak uniquevalues tárolja a HashSet. Ha újra megpróbálja tárolni ugyanazt az elemet, akkor a számított hash függvény ugyanaz lesz, így az elem felülíródik.
HashSet belsőleg használja HashMap
most jön vissza a belső végrehajtása HashSet Java a legfontosabb pont HashSet osztály végrehajtása belsőleg használja HashMap tárolni ez elemeit.
a HashSet-en belül sok konstruktor van, egy paraméter nélküli, Több pedig kezdeti kapacitással vagy terhelési tényezővel, de mindegyik konstruktor létrehoz egy HashMap-ot.Mivel a HashSet belsőleg használja a HashMap-ot, így a HashMap belső működésének ismerete a Java-ban segít megérteni, hogyan működik a HashSet belsőleg a Java-ban.
HashSet Constructor snippets
a Java HashSet osztályában láthatja, hogy az osztály konstruktorai létrehoznak egy HashMap-ot.
/*** Constructs a new, empty set; the backing <tt>HashMap</tt> instance has* default initial capacity (16) and load factor (0.75).*/public HashSet() { map = new HashMap<>();}
public HashSet(int initialCapacity, float loadFactor) { map = new HashMap<>(initialCapacity, loadFactor);}
az értékek tárolására használt térkép pedig
private transient HashMap<E,Object> map;
a konstruktorban, ha észrevetted, vannak kezdeti kapacitás és terhelési tényező nevű paraméterek.A HashSet esetében az alapértelmezett kezdeti kapacitás 16, vagyis egy 16 hosszúságú tömb (vagy vödör) jön létre, ésaz alapértelmezett terhelési tényező 0,75. Ahol a terhelési tényező annak mértéke, hogy a hash tábla mennyire teljes, mielőtt elérhetőkapacitása automatikusan megnő.
az elemek hozzáadása – HashSet belső megvalósítás
a fenti 2.pontban kijelentettem, hogy a HashSet kiszámítja a hash függvényt magának az értéknek a felhasználásával, és nincs (kulcs, érték) pár a Hashsetben, majd jött az a kijelentés, hogy a HashSet belsőleg használja a HashMap-ot objektumok tárolására.Ez a két állítás ellentmondásosnak tűnhet, mivel a HashMap tárolja (kulcs, érték) párját, tehát nézzük meg, hogy ezek a két ellentmondó állítás igaz-e.
valójában a hashset osztály add metódusából put () a HashMap metódusát hívjuk meg, ahol az érték, amelyet hozzá kell adni a készlethez, Kulcssá válik, és egy állandó “jelen” objektumot használunk értékként.
így van meghatározva a jelen a HashSet megvalósításában-
// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();
így valósul meg az add metódus a HashSet osztályban –
public boolean add(E e) { return map.put(e, PRESENT)==null;}
tehát a HashSet belső megvalósításában láthatja ,hogy ez egy (kulcs, érték) pár, amely valójában egyre added.It csak a tényleges érték (amely hozzáadódik a Hashsethez) lesz a kulcs, és egy “PRESENT” dummy érték kerül hozzáadásra értékként, amikor a háttér HashMap-ben tárolja.
például egy utasítás egy elem hozzáadásához a HashSet-készlethez.add (“Mumbai”); belsőleg lefordítja térkép.tesz (“Mumbai”, jelen); majd hozzáadta a hátsó HashMap példányhoz.
itt meg kell jegyezni, hogy a HashMap érték duplikált lehet, de a kulcsnak egyedinek kell lennie. Így Hashsetgyőződik arról, hogy csak egyedi értékeket tárolnak benne, mivel a Hashsetben tárolandó érték lesz a kulcs, miközben a HashMap-ban tárolja.
az elem eltávolítása – HashSet belső megvalósítás
amikor el kell távolítanunk egy elemet a HashSet-ből, belsőleg ismét távolítsa el a HashSetcalls remove(Object key) módszerét a HashMap.
így valósul meg a HashSet osztályban.
public boolean remove(Object o) { return map.remove(o)==PRESENT;}
itt vegye figyelembe, hogy a HashMap remove(Object key) metódusa visszaadja a kulcshoz társított értéket.Míg a HashSet remove(Object o) metódusa logikai értéket ad vissza. Azt is tudjuk, hogy minden valueadded HashSet, belsőleg, amikor hozzáadjuk a kapcsolódó HashMap, érték lesz kulcs és az érték mindig ANOBJECT nevű jelen. Ezért a HashMap remove(Object key) metódusából visszaadott érték mindig jelen van, így a feltételtérkép.távolítsa el (o) = = jelen van.
az elemek lekérése a Hashset-ből a Java-ban
a HashSet-ben nincs get módszer, amint azt a Map vagy a List biztosítja. A HashSet iterator van, amely iteratethrough az értékek a készlet. Belsőleg meg fogja hívni a HashMap kulcskészletét, mivel az értékeket kulcsokként tárolják a HashMap-ban, így megkapjuk a HashSet-ben tárolt értékeket.
így iterator belsőleg végre a Hashset Java.
/*** Returns an iterator over the elements in this set. The elements* are returned in no particular order.** @return an Iterator over the elements in this set* @see ConcurrentModificationException*/public Iterator<E> iterator() { return map.keySet().iterator();}
megjegyzés
- a HashMap-től eltérően, ahol a hash függvényt kulcs segítségével számítják ki HashSet magát az értéket használja a hash függvény kiszámításához.
- mivel a hash függvény értéke alapján kerül kiszámításra, ezért csak egyedi értékeket tárol a HashSet.
- a HashSet belsőleg használja a HashMap-ot az elemek tárolására.
- amikor elemet adunk HashSet segítségével add (E e) módszer belsőleg HashSet hívások put () módszer a HashMap wherethe átadott érték az add módszer lesz kulcs a put () módszer. A “PRESENT” dummy értéket értékként adjuk áta put() módszer.
ajánlások a tanuláshoz (Udemy tanfolyamok)
- Java programozás mesterkurzus
- Java in-Depth: legyen teljes Java mérnök!
- Spring Framework mesterkurzus
- Complete Python Bootcamp tanfolyam
- Python Adattudomány és gépi tanulás
ez minden ebben a témában Hogyan HashSet működik belsőleg Java. Ha bármilyen kétsége vagy javaslata van, kérjük, írjon egy megjegyzést. Kösz!
kapcsolódó témák
- hogyan működik az ArrayList belsőleg a Java-ban
- hogyan működik a HashMap belsőleg a Java-ban
- hogyan működik a LinkedList osztály belsőleg a Java-ban
- LinkedHashSet Java-ban példákkal
- TreeSet Java-ban példákkal
Ön is kedvelheti –