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 }
Geeks1 Geeks2 Geeks1