Ok, déjenme explicar el concepto en palabras muy simples.
En primer lugar, desde una perspectiva más amplia, tenemos colecciones, y el hashmap es una de las estructuras de datos en las colecciones.
Para entender por qué tenemos que anular los métodos de igual y hashcode, si es necesario primero entender qué es hashmap y qué hace.
Un hashmap es una estructura de datos que almacena pares de datos de valores clave en forma de matriz. Digamos a [], donde cada elemento en 'a' es un par de valores clave.
Además, cada índice de la matriz anterior puede vincularse con una lista que tenga más de un valor en un índice.
Ahora, ¿por qué se usa un hashmap? Si tenemos que buscar entre una gran matriz, buscar en cada una de ellas si no será eficiente, entonces, ¿qué técnica de hash nos dice que preprocesemos la matriz con cierta lógica y agrupemos los elementos basados en esa lógica, es decir, Hashing?
por ejemplo: tenemos una matriz 1,2,3,4,5,6,7,8,9,10,11 y aplicamos una función hash mod 10, de modo que 1,11 se agruparán. Entonces, si tuviéramos que buscar 11 en la matriz anterior, tendríamos que iterar la matriz completa, pero cuando la agrupamos, limitamos nuestro alcance de iteración, mejorando así la velocidad. Esa estructura de datos utilizada para almacenar toda la información anterior se puede considerar como una matriz 2D para simplificar
Ahora, aparte del hashmap anterior, también indica que no agregará ningún duplicado en él. Y esta es la razón principal por la que tenemos que anular los iguales y el código hash
Entonces, cuando se dice que explica el funcionamiento interno de hashmap, necesitamos encontrar qué métodos tiene el hashmap y cómo sigue las reglas anteriores que expliqué anteriormente
entonces el hashmap tiene un método llamado put (K, V), y de acuerdo con el hashmap, debe seguir las reglas anteriores de distribuir eficientemente la matriz y no agregar duplicados
así que lo que pone es que primero generará el código hash para la clave dada para decidir en qué índice debe ingresar el valor. Si no hay nada presente en ese índice, entonces el nuevo valor se agregará allí, si ya hay algo presente allí entonces el nuevo valor debe agregarse después del final de la lista vinculada en ese índice. pero recuerde que no se deben agregar duplicados según el comportamiento deseado del hashmap. digamos que tienes dos objetos enteros aa = 11, bb = 11. Como cada objeto derivado de la clase de objeto, la implementación predeterminada para comparar dos objetos es que compara la referencia y no los valores dentro del objeto. Entonces, en el caso anterior, aunque sean semánticamente iguales, no pasarán la prueba de igualdad, y existe la posibilidad de que existan dos objetos que tengan el mismo código hash y los mismos valores creando así duplicados. Si anulamos, podríamos evitar agregar duplicados. También puedes referirte aDetalle de trabajo
import java.util.HashMap;
public class Employee {
String name;
String mobile;
public Employee(String name,String mobile) {
this.name=name;
this.mobile=mobile;
}
@Override
public int hashCode() {
System.out.println("calling hascode method of Employee");
String str=this.name;
Integer sum=0;
for(int i=0;i<str.length();i++){
sum=sum+str.charAt(i);
}
return sum;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
System.out.println("calling equals method of Employee");
Employee emp=(Employee)obj;
if(this.mobile.equalsIgnoreCase(emp.mobile)){
System.out.println("returning true");
return true;
}else{
System.out.println("returning false");
return false;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee emp=new Employee("abc", "hhh");
Employee emp2=new Employee("abc", "hhh");
HashMap<Employee, Employee> h=new HashMap<>();
//for (int i=0;i<5;i++){
h.put(emp, emp);
h.put(emp2, emp2);
//}
System.out.println("----------------");
System.out.println("size of hashmap: "+h.size());
}
}