janvier 19, 2022

Java Hungry

Dans les questions d’entrevue java de base, Il est courant d’être bombardé de questions de cadre de collection. J’ai été interviewé par Goldman Sachs, et là, ils ont posé une question où je suis devenu stupéfait. L’intervieweur a demandé Comment implémentez-vous Set en Java, c’est-à-dire le travail interne de Hashset ou Comment fonctionne hashset en java. Autrement dit, comment s’assurer que chaque élément est unique sans utiliser d’interfaces Set ou de classes qui implémentent l’interface Set.
Lire aussi: Comment fonctionne la carte de hachage en java
J’ai donné la réponse, bien que j’ai également qualifié le cycle d’entrevue, mais la réponse est loin d’être satisfaisante.
Je suis donc revenu à la maison et j’ai fait quelques recherches. J’ai finalement eu la réponse et je l’ai partagée avec vous.

 Comment fonctionne HashSet en interne en java

Définir l’implémentation en interne en Java
Chaque élément de l’ensemble est unique. Pour qu’il n’y ait pas d’élément en double dans l’ensemble.
Donc en java si nous voulons ajouter des éléments dans l’ensemble, nous écrivons du code comme ceci

 classe publique JavaHungry {public static void main (String args) { // Méthode générée automatiquement par TODO stub HashSet < Object > hashset = new HashSet < Object >(); hashset.ajouter (3); hashset.ajouter ("Java Hungry"); hashset.ajouter ("Blogspot"); Système.hors.println("Ensemble est" + hashset); }}

Il imprimera le résultat : Set est
Maintenant, ajoutons un élément en double dans le code ci-dessus

 classe publique JavaHungry {public static void main (String args) { HashSet < Object > hashset = new HashSet < Object >(); hashset.ajouter (3); hashset.ajouter ("Java Hungry"); hashset.ajouter ("Blogspot"); hashset.add(3); // dupliquer le hashset des éléments.add("Java Hungry"); // Système d'éléments en double.hors.println("Ensemble est" + hashset); }}

Il imprimera le résultat : Set est
Maintenant, ce qui se passe en interne lorsque vous passez des éléments en double dans la méthode add() de l’objet Set, Il retournera false et ne s’ajoutera pas au HashSet, car l’élément est déjà présent. Jusqu’à présent, tout va bien.
Mais le principal problème se pose de savoir comment il retourne false. Voici donc la réponse
Lorsque vous ouvrez l’implémentation de HashSet de la méthode add() dans les api Java qui est rt.jar , vous y trouverez le code suivant

 public class HashSet < E > étend AbstractSet < E > implémente Set < E >, Clonable, java.io .Serializable { private transient HashMap <E, Object > map; // Valeur factice à associer à un Objet de la carte de sauvegarde private static final Object PRESENT= new Object(); public HashSet() { map= new HashMap<>(); } // UN PEU DE CODE, c'est-à-dire d'autres méthodes dans le jeu de hachage public booléen add(E e) { return map.put(e, PRESENT) == null; } // DU CODE, c'est-à-dire d'autres méthodes dans le jeu de hachage}

Nous réalisons donc l’unicité dans Set, en interne en java via HashMap. Chaque fois que vous créez un objet de HashSet, il créera un objet de HashMap comme vous pouvez le voir dans les lignes italiques du code ci-dessus.
Nous avons déjà discuté du fonctionnement de HashMap en interne en java.
Comme nous le savons dans HashMap, chaque clé est unique. Donc, ce que nous faisons dans l’ensemble, c’est que nous passons l’argument dans l’add (Elemene E) qui est E comme clé dans le HashMap. Maintenant, nous devons associer une valeur à la clé, donc ce que le développeur d’api Java a fait est de transmettre la valeur factice qui est (new Object()) qui est référencée par la référence d’objet PRÉSENTE.
Donc, en fait, lorsque vous ajoutez une ligne dans HashSet comme hashset.add(3) ce que java fait en interne, c’est qu’il mettra cet élément E ici 3 en tant que clé dans le HashMap (créé lors de la création de l’objet HashSet) et une valeur factice qui est l’objet de l’objet est transmise en tant que valeur à la clé.
Maintenant, si vous voyez le code de la méthode HashMap put (Clé k, Valeur V), vous trouverez quelque chose comme ceci
public V put(clé K, valeur V) {
// Du code
}
Le point principal à remarquer dans le code ci-dessus est que put(clé, valeur) retournera
1. null, si la clé est unique et ajoutée à la carte
2. Ancienne valeur de la clé, si la clé est en double
Donc, dans la méthode HashSet add(), nous vérifions la valeur de retour de map.méthode put(key, value) avec une valeur nulle
c’est-à-dire
public boolean add(E e) {
carte de retour.mettre (e, PRÉSENT) == null;

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.