Ok, he escuchado de muchos lugares y fuentes que siempre que sobreescribo el método equals(), también debo reemplazar el método hashCode(). Pero considere el siguiente fragmento de código¿Por qué debería anular hashCode() cuando anulo el método equals()?
package test;
public class MyCustomObject {
int intVal1;
int intVal2;
public MyCustomObject(int val1, int val2){
intVal1 = val1;
intVal2 = val2;
}
public boolean equals(Object obj){
return (((MyCustomObject)obj).intVal1 == this.intVal1) &&
(((MyCustomObject)obj).intVal2 == this.intVal2);
}
public static void main(String a[]){
MyCustomObject m1 = new MyCustomObject(3,5);
MyCustomObject m2 = new MyCustomObject(3,5);
MyCustomObject m3 = new MyCustomObject(4,5);
System.out.println(m1.equals(m2));
System.out.println(m1.equals(m3));
}
}
Aquí la salida es verdadero, falso exactamente como yo quiero que sea y no me importa de reemplazando el método hashCode() en absoluto. Esto significa que la anulación de hashCode() es una opción más bien una obligatoria, como dicen todos.
Quiero una segunda confirmación.
posible duplicado de http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when-equals-method-is-overriden-in-c – Oded
No es una tontería de ese; eso es C#, esto es Java. (El problema es muy similar, tal vez idéntico, pero aún así) – Thomas