Java Hungry
v core java interview questions je běžné bombardovat otázkami kolekce framework . Byl jsem vyslýchán v Goldman Sachs, a tam položili otázku, Kde jsem byl ohromen . Tazatel se zeptal, Jak implementujete sadu v Javě jinými slovy interní práci Hashsetu nebo jak hashset funguje v Javě. To znamená, jak se ujistí, že každý prvek je jedinečný bez použití nastavených rozhraní nebo tříd, které implementují nastavené rozhraní .
Přečtěte si také: Jak hash mapa funguje v Javě
dal jsem odpověď, i když kvalifikoval kolo rozhovoru, ale odpověď není zdaleka uspokojivá .
tak jsem se vrátil domů a udělat nějaký výzkum . Nakonec jsem dostal odpověď a sdílel ji s vámi .
nastavit implementaci interně v Javě
každý prvek v sadě je jedinečný . Takže v sadě není žádný duplicitní prvek .
takže v Javě, pokud chceme přidat prvky v sadě, pak napíšeme kód, jako je tento
veřejná třída JavaHungry { public static void main(String args) {//TODO Auto-generovaná metoda stub HashSet< objekt> hashset = new HashSet<objekt>(); hashset.přidat (3); hashset.přidat ("Java Hungry"); hashset.přidat ("Blogspot"); systém.mimo.println ("Set is" +hashset); }}
vytiskne výsledek : Sada je
Nyní přidejte duplicitní prvek do výše uvedeného kódu
veřejná třída JavaHungry { public static void main (String args) { HashSet< Object> hashset = new HashSet<Object>(); hashset.přidat (3); hashset.přidat ("Java Hungry"); hashset.přidat ("Blogspot"); hashset.přidat (3); // duplicitní prvky hashset.přidat ("Java Hungry"); / / duplicate elements System.mimo.println ("Set is" +hashset); }}
vytiskne výsledek : Set je
nyní , co se stane interně, když předáte duplicitní prvky v metodě add() nastaveného objektu, vrátí false a nepřidá do Hashsetu, protože prvek je již přítomen. zatím dobře .
ale hlavní problém vyvstává, že jak se vrátí false . Takže tady je odpověď
když otevřete implementaci HashSet metody add() v Java API, která je rt.jar , najdete v něm následující kód
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{ private transient HashMap<e, Object> map; / / Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object (); public HashSet () { map = new HashMap<>(); } // nějaký kód, tj. jiné metody v Hash Set public boolean add (E e) { návratová mapa.put (e, PRESENT)= = null;} / / nějaký kód, tj. jiné metody v hašovací sadě}
takže dosahujeme jedinečnosti v sadě, interně v Javě prostřednictvím HashMap . Kdykoli vytvoříte objekt HashSet, vytvoří objekt HashMap, jak můžete vidět v kurzívě ve výše uvedeném kódu .
již jsme diskutovali o tom, jak HashMap funguje interně v Javě .
jak víme v Hashmapu, každý klíč je jedinečný . Takže to, co děláme v sadě, je, že předáme argument v add (Elemene E), který je E jako klíč v HashMap . Nyní musíme přiřadit nějakou hodnotu ke klíči, takže to, co vývojář Java API udělal, je předat fiktivní hodnotu, která je (nový objekt ()), který je odkazován na objekt přítomen .
takže vlastně když přidáváte řádek v HashSet jako hashset.add (3) Co java dělá interně, je to, že vloží tento prvek e sem 3 jako klíč do Hashmapy (vytvořené během vytváření objektu HashSet) a nějaká fiktivní hodnota, která je objektem objektu, je předána jako hodnota klíči .
nyní, když vidíte kód metody HashMap put(klíč k , hodnota V), najdete něco takového
Veřejné v put(klíč k, hodnota V) {
//nějaký kód
}
hlavním bodem,který si všimnete ve výše uvedeném kódu, je, že put (klíč, hodnota) se vrátí
1. null, pokud je klíč jedinečný a přidán do mapy
2. Stará hodnota klíče, pokud je klíč duplicitní
takže v metodě HashSet add() zkontrolujeme návratovou hodnotu mapy.metoda put (key,value) s nulovou hodnotou
tj.
public boolean add (E e) {
návratová mapa.put (e, PRESENT)==null;