Funcionamiento interno de Set/HashSet en Java

Como sabemos, un conjunto es una colección bien definida de objetos distintos. Cada miembro de un conjunto se llama elemento del conjunto. Entonces, en otras palabras, podemos decir que un conjunto nunca contendrá elementos duplicados . Pero, ¿cómo en la interfaz Java Set se implementaron clases como HashSet , LinkedHashSet , TreeSet , etc. para lograr esta singularidad? En esta publicación, discutiremos la verdad oculta detrás de esta singularidad.

¿Cómo funciona HashSet internamente en Java?

How Set/HashSet works internally  in Java
We will understand this with an example.Let us see the output of the following program which try to add duplicate elements in a HashSet.

// Java program to demonstrate
// internal working of HashSet
  
import java.util.HashSet;
  
class Test
{    
    public static void main(String args[]) 
    {
        // creating a HashSet
        HashSet hs = new HashSet();
          
        // adding elements to hashset
        // using add() method
        boolean b1 = hs.add("Geeks");
        boolean b2 = hs.add("GeeksforGeeks");
          
        // adding duplicate element
        boolean b3 = hs.add("Geeks");
          
        // printing b1, b2, b3
        System.out.println("b1 = "+b1);
        System.out.println("b2 = "+b2);
        System.out.println("b3 = "+b3);
          
        // printing all elements of hashset
        System.out.println(hs);
              
    }
}

Producción:

b1 = true
b2 = true
b3 = false
[GeeksforGeeks, Geeks]

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() verifica 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 class
public 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() en el objeto HashMap creado internamente con el elemento que ha especificado como su Objeto clave y constante se llama “PRESENTE” como su valor. Entonces podemos decir que un Set logra la unicidad internamente a través de HashMap . Ahora toda la historia se trata de 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 la clave, o nulo si no hubo una asignación para la clave. Entonces, en el método add() , verificamos el valor de retorno del método map.put (clave, valor) con valor nulo .

  1. Si map.put(key, value) devuelve nulo , entonces la declaración «map.put(e, PRESENT) == null» devolverá verdadero y el elemento se agregará al HashSet (internamente HashMap).
  2. Si map.put(key, value) devuelve el valor antiguo de la clave, entonces la declaración «map.put(e, PRESENT) == null» devolverá false y el elemento no se agregará al HashSet (internamente HashMap).

Como LinkedHashSet extiende HashSet, llama internamente a los constructores de HashSet usando super() . De manera similar, la creación de un objeto de la clase TreeSet crea internamente un objeto de Navigable Map 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 le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *