GeeksforGeeks

Ya que sabemos que un conjunto es una colección bien definida de objetos distintos. Cada miembro de un conjunto se denomina elemento del conjunto. En otras palabras, podemos decir que un conjunto nunca contendrá elementos duplicados. Pero cómo en la interfaz de conjunto de java implementó clases como HashSet, LinkedHashSet, TreeSet, etc. lograr esta singularidad. En este post, discutiremos la verdad oculta detrás de esta singularidad.

¿Cómo funciona el HashSet internamente en Java?

Atención del lector! No dejes de aprender ahora. Obtenga todos los conceptos importantes de Java Foundation y Collections con los Fundamentos de Java y el curso de Java Collections a un precio amigable para los estudiantes y prepárese para la industria. Para completar su preparación, desde aprender un idioma hasta algo de DS y muchos más, consulte El Curso Completo de Preparación para Entrevistas.

Cómo funciona internamente Set/HashSet en Java
Entenderemos esto con un ejemplo.Veamos la salida del siguiente programa que intenta agregar elementos duplicados en un HashSet.

import java.util.HashSet;
class Test
{
public static void main(String args)
{
HashSet hs = new HashSet();
boolean b1 = hs.add("Geeks");
boolean b2 = hs.add("GeeksforGeeks");
boolean b3 = hs.add("Geeks");
System.out.println("b1 = "+b1);
System.out.println("b2 = "+b2);
System.out.println("b3 = "+b3);
System.out.println(hs);
}
}



Salida:

b1 = trueb2 = trueb3 = false

Ahora, a partir de la salida, está claro que cuando intentamos agregar un elemento duplicado a un conjunto usando el método add (), devuelve false, y el elemento no se agrega al hashset, ya que ya está presente. Ahora viene la pregunta, cómo el método add () comprueba si el conjunto ya contiene el elemento especificado o no. Será más claro si echamos un vistazo más de cerca al método add() y al constructor predeterminado en la clase HashSet.

// predefined HashSet classpublic class HashSet{ // A HashMap object private transient HashMap map; // A Dummy value(PRESENT) to associate with an Object in the Map private static final Object PRESENT = new Object(); // default constructor of HashSet class // It creates a HashMap by calling // default constructor of HashMap class public HashSet() { map = new HashMap(); } // add method // it calls put() method on map object // and then compares it's return value with null public boolean add(E e) { return map.put(e, PRESENT)==null; } // Other methods in Hash Set}

Ahora, como puede ver, cada vez que creamos un HashSet, crea internamente un HashMap y si insertamos un elemento en este HashSet usando el método add (), en realidad llama al método put() al objeto HashMap creado internamente con el elemento que ha especificado como su clave y el objeto constante llamado «PRESENTE» como su valor. Así que podemos decir que un Conjunto alcanza la unicidad internamente a través de HashMap. Ahora, toda la historia gira en torno a cómo funciona internamente un método HashMap y put ().

Como sabemos en un HashMap, cada clave es única y cuando llamamos al método put(Clave, Valor), devuelve el valor anterior asociado con clave, o null si no había asignación para clave. Así que en el método add () comprobamos el valor devuelto de map.método put(clave, valor) con valor nulo.

  1. Mapa If.put (key, value) devuelve null, luego la instrucción «map.put (e, PRESENT) = = null » devolverá true y el elemento se añadirá al HashSet(HashMap interno).
  2. Mapa If.put (key, value) devuelve el valor antiguo de la clave, luego la instrucción «map.put (e, PRESENT) = = null » devolverá false y el elemento no se añadirá al HashSet(HashMap interno).

Como LinkedHashSet extiende el HashSet, por lo que llama internamente a los constructores de HashSet usando super(). De manera similar, la creación interna de un objeto de la clase TreeSet crea un objeto de Mapa navegable como mapa de respaldo.

Artículo relacionado: Cómo funciona internamente HashMap en Java.

Este artículo es una contribución de Gaurav Miglani. Si te gustan los GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando contribute.frikis forgeeks.org o envíe su artículo a [email protected]. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Deja una respuesta

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