enero 19, 2022

Hambre de Java

En las preguntas de entrevista de java central , Es común ser bombardeado con preguntas de marco de recopilación . Me entrevistaron en Goldman Sachs, y allí me hicieron una pregunta en la que me quedé estupefacto . El entrevistador preguntó Cómo implementar Set en Java, en otras palabras, el funcionamiento interno del Hashset o Cómo funciona el hashset en java. Es decir, cómo se asegurará de que todos y cada uno de los elementos sean únicos sin usar interfaces de conjunto o Clases que implementen la Interfaz de conjunto .
Lea También : Cómo hash mapa funciona en java
me dio la respuesta , aunque calificó la entrevista ronda , pero la respuesta está lejos de ser satisfactoria .
Así que volví a casa e investigué un poco . Así que finalmente obtuve la respuesta y la compartí con ustedes .

Cómo HashSet trabaja internamente en java

Implementación Internamente en Java
Cada elemento del conjunto es único . Para que no haya elementos duplicados en el conjunto .
Así que en java, si queremos agregar elementos en el conjunto, escribimos código como este

 clase pública JavaHungry { public static void main (String args) { // Hashset stub del método generado automáticamente TODO<Object> hashset = nuevo HashSet<Object> (); hashset.add (3); hashset.add ("Java Hungry"); hashset.agregar ("Blogspot"); Sistema.fuera.println ("Set is" + hashset); }}

Imprimirá el resultado : Set es
Ahora vamos a añadir elemento duplicado en el código anterior

 clase pública JavaHungry { public static void main (String args) { HashSet<Object> hashset = nuevo HashSet<Object> (); hashset.add (3); hashset.add ("Java Hungry"); hashset.agregar ("Blogspot"); hashset.add (3); / / duplique el hashset de elementos.add ("Java Hungry"); / / sistema de elementos duplicados.fuera.println ("Set is" + hashset); }}

Imprimirá el resultado : Set es
Ahora, lo que sucede internamente cuando pasa elementos duplicados en el método add () del objeto Set , devolverá false y no agregará al HashSet , ya que el elemento ya está presente .
Pero el principal problema surge de cómo devuelve false . Así que aquí está la respuesta
Cuando abre la implementación de HashSet del método add () en Api de Java que es rt.jar , encontrará el siguiente código en él

HashSet de clase pública< E> extiende el conjunto abstracto< E> implementa el conjunto< E>, Clonable, java.io.Serializable{ HashMap transitorio privado< E, Objeto> map; / / Valor ficticio para asociar con un objeto en el Mapa de respaldo objeto final estático privado PRESENTE = nuevo objeto(); HashSet público() { map = nuevo HashMap<>(); } // ALGÚN CÓDIGO, es decir, Otros métodos en el conjunto de Hash booleano público add (E e) { return map.put (e, PRESENT) = = null;} / / ALGÚN CÓDIGO, es decir, Otros métodos en el Conjunto de Hash}

Por lo tanto,estamos logrando singularidad en Conjunto, internamente en java a través de HashMap . Cada vez que cree un objeto de HashSet, creará un objeto de HashMap como puede ver en las líneas en cursiva en el código anterior .
Ya hemos discutido Cómo funciona HashMap internamente en java .
Como sabemos en HashMap, cada clave es única . Así que lo que hacemos en el conjunto es que pasamos el argumento en el add (Elemene E) que es E como una clave en el HashMap . Ahora necesitamos asociar algún valor a la clave, por lo que lo que hizo el desarrollador de api de Java es pasar el valor ficticio que es ( new Object () ) que se refiere por Referencia de objeto PRESENTE .
Por lo tanto, en realidad cuando está agregando una línea en un HashSet como hashset.add (3) lo que java hace internamente es poner ese elemento E aquí 3 como clave en el HashMap(creado durante la creación de objetos de HashSet) y un valor ficticio que es el objeto del objeto se pasa como valor a la clave .
Ahora, si ve el código del método HashMap put(Clave k,Valor V), encontrará algo como esto
public V put (clave K, valor V) {
//Algún código
}
El punto principal a observar en el código anterior es que put (clave,valor) devolverá
1. null, si la clave es única y se añade al mapa
2. Valor antiguo de la clave , si la clave es duplicada
Por lo tanto , en el método HashSet add (), verificamos el valor devuelto de map.método put (key, value) con valor nulo
, es decir,
booleano público add(E e) {
devuelve mapa.put (e, PRESENTE) = = null;

Deja una respuesta

Tu dirección de correo electrónico no será publicada.