Java Hungry
in core java interview questions , is het gebruikelijk om gebombardeerd te worden met Collection framework questions . Ik werd geïnterviewd in Goldman Sachs , en daar stelden ze een vraag waar ik met stomheid geslagen werd . Interviewer vroeg hoe u Set in Java implementeren met andere woorden interne werking van Hashset of hoe hashset werkt in java. Dat wil zeggen, hoe zal ervoor zorgen dat elk element uniek is zonder het gebruik van Set interfaces of klassen die Set Interface implementeert.
Lees ook: hoe hash map werkt in java
ik gaf het antwoord, hoewel ik ook de interviewronde kwalificeerde , maar het antwoord is verre van bevredigend .
dus kwam ik terug naar huis en deed wat onderzoek . Dus eindelijk heb ik het antwoord en het delen met u .
implementatie intern instellen in Java
elk element in de set is uniek . Zodat er geen duplicaat element in set.
dus in java als we elementen in de set willen toevoegen, schrijven we code als deze
public class JavaHungry { public static void main(String args) { // todo automatisch gegenereerde methode Stub HashSet<Object> hashset = new HashSet<Object>(); hashset.toevoegen (3); hashset.toevoegen("Java hongerig"); hashset.toevoegen ("Blogspot"); systeem.uit.println ("Set is" +hashset); }}
het zal het resultaat afdrukken : Set is
laat nu duplicaat element toevoegen in de bovenstaande code
public class JavaHungry { public static void main (String args) { HashSet<Object> hashset = new HashSet<Object> (); hashset.toevoegen (3); hashset.toevoegen("Java hongerig"); hashset.toevoegen("Blogspot"); hashset.add (3); / / duplicate elements hashset.toevoegen("Java Hungry"); / / duplicate elements System.uit.println ("Set is" +hashset); }}
het zal het resultaat afdrukken : Set is
nu, wat intern gebeurt als je dubbele elementen passeert in de methode add () van het Set object, zal het false teruggeven en niet toevoegen aan de HashSet , omdat het element al aanwezig is .tot nu toe is het goed .
maar het grootste probleem doet zich voor dat hoe het false retourneert . Dus hier is het antwoord
wanneer u de HashSet implementatie van de methode add() in Java API ‘ s die is rt.jar , vindt u de volgende code erin
public class HashSet<E>breidt AbstractSet<E>implementeert Set<E>, Cloneable, java.io.Serialiseerbare{ private transient HashMap<E, Object> map; / / Dummy waarde te associëren met een Object in de backing Map private static final Object PRESENT = new Object (); public HashSet() { map = new HashMap<>(); } // sommige CODE, dat wil zeggen andere methoden in Hash Set public boolean add (E e) { return map.put (e, PRESENT) = = null;} / / sommige CODE, dat wil zeggen andere methoden in Hash Set}
dus, we bereiken uniciteit in Set, intern in java door middel van HashMap . Wanneer u een object van HashSet maakt, zal het een object van HashMap maken, zoals u kunt zien in de cursieve regels in de bovenstaande code .
we hebben al besproken hoe HashMap intern werkt in java .
zoals we weten in HashMap is elke sleutel uniek . Dus wat we in de set doen is dat we het argument in de add(Elemene E) doorgeven dat E is als een sleutel in de HashMap . Nu moeten we enige waarde associëren met de sleutel , dus wat Java apis Ontwikkelaar deed is om de Dummy waarde die ( nieuw Object () ) die wordt verwezen door Object referentie aanwezig doorgeven .
dus, eigenlijk wanneer u een regel in HashSet zoals hashset toevoegt.voeg(3) wat java intern doet is dat het element E Hier 3 als een sleutel in de HashMap(gemaakt tijdens HashSet object creatie) en een dummy waarde die Object object is wordt doorgegeven als een waarde aan de sleutel .
als u nu de code van de HashMap put(Key k,Value V) methode ziet , zult u iets als dit vinden
public V put(K key, V value) {
//enige code
}
het belangrijkste punt om op te merken in bovenstaande code is dat put (key,value)
1 retourneert. null, als de sleutel uniek is en toegevoegd aan de kaart
2. Oude waarde van de sleutel , als de sleutel duplicaat
is , controleren we in de methode HashSet add() de retourwaarde van de kaart.put(key,value) method with null value
i.e.
public boolean add (E e) {
return map.put (E, aanwezig) = = null;