¿Cómo crear un Java HashMap de tipo de clase definido por el usuario?

Requisito previo: funcionamiento interno de HashMap , HashMap
Si deseamos crear un HashMap de nuestra propia clase, debemos asegurarnos de que el código hash() de la clave de HashMap no cambie como si sucediera, entonces es imposible obtener valor de objeto de la clave de HashMap.

En el tiempo de ejecución, JVM procesa el código hash para cada objeto y le da interés. Cuando alteramos el estado de un objeto, JVM calcula su código hash nuevamente, lo que puede provocar una pérdida de memoria. Para que las cosas funcionen, lo que tenemos que hacer es asegurarnos de que el cambio de estado de un objeto clave no cambie el código hash del objeto, es decir , la clave debe haber anulado correctamente los métodos equals() y hashcode() para que funcione correctamente.

Una de las formas de hacerlo es haciendo que los objetos clave sean INMUTABLES . La inmutabilidad le permite obtener el mismo código hash cada vez, para un objeto clave. Esta es la principal motivación detrás de por qué las clases inmutables como String, Integer u otras clases contenedoras son un solicitante de objeto clave decente. Obtenga más información sobre esto aquí: ¿Cómo hacer que la clase sea inmutable?

// Java example to create a Java HashMap
// of user-defined class type
  
import java.util.*;
import java.io.*;
  
// User defined class
public class CustomKeyObject {
  
    public static class Student {
  
        private int rollno;
        private String name;
  
        // Constructor
        public Student(int rollno, String name)
        {
            this.rollno = rollno;
            this.name = name;
        }
  
        public String getname()
        {
            return this.name;
        }
  
        public int getmarks()
        {
            return this.rollno;
        }
  
        public void setname(String name)
        {
            this.name = name;
        }
  
        public void setmarks(int rollno)
        {
            this.rollno = rollno;
        }
  
        // Overriding the hashcode() function
        @Override
        public int hashCode()
        {
  
            // uses roll no to verify the uniqueness
            // of the object of Student class
  
            final int temp = 14;
            int ans = 1;
            ans = temp * ans + rollno;
            return ans;
        }
  
        // Equal objects must produce the same
        // hash code as long as they are equal
        @Override
        public boolean equals(Object o)
        {
            if (this == o) {
                return true;
            }
            if (o == null) {
                return false;
            }
            if (this.getClass() != o.getClass()) {
                return false;
            }
            Student other = (Student)o;
            if (this.rollno != other.rollno) {
                return false;
            }
            return true;
        }
    }
  
    // main method
    public static void main(String[] args)
        throws NumberFormatException,
               IOException
    {
        HashMap<Student, String> map = new HashMap<>();
  
        Student one = new Student(1, "Geeks1"); // key1
  
        Student two = new Student(2, "Geeks2"); // key2
  
        // put keys in map
        map.put(one, one.getname());
        map.put(two, two.getname());
  
        // changing key state so that
        // hashcode() should be calculated again
        one.setname("Not Geeks1");
        two.setname("Not Geeks2");
  
        // still prints Geeks1
        System.out.println(map.get(one));
  
        // still prints Geeks1
        System.out.println(map.get(two));
  
        // try with newly created key with same Rollno
        Student three = new Student(1, "Geeks3");
  
        // we get Geeks1
        System.out.println(map.get(three));
    }
  
    // This code is contributed by Subhesh
}
Producción:

Geeks1
Geeks2
Geeks1

Publicación traducida automáticamente

Artículo escrito por subhu1999 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 *