1. El método eqauls y el método hashCode en Java
(1) Si dos objetos son iguales (el método igual devuelve verdadero), entonces sus valores hashCode deben ser los mismos
(2) Si el código hash de dos objetos es el mismo, no son necesariamente el mismo (no necesariamente el mismo objeto)
Si viola los principios anteriores, encontrará que al usar contenedores, los mismos objetos pueden aparecer en la misma colección Set (Set no puede almacenar los mismos elementos), y la eficiencia de agregar nuevos elementos se reducirá en gran medida (para sistemas que usan almacenamiento hash , Si la colisión frecuente de códigos hash provocará una fuerte caída en el rendimiento del acceso)
2. Características del método igual
(1) reflexividad
x.equals (x) : verdadero
(2) simetría
Cuando x.equals (y) devuelve verdadero, y.equals (x) también debe devolver verdadero
(3) Transmisibilidad
Cuando tanto x.equals (y) como y.equals (z) devuelven verdadero, x.equals (z) también debe devolver verdadero
(4) Consistencia
Cuando la información del objeto referenciada por xey no se ha modificado, las llamadas múltiples a x.equals (y) deben obtener el mismo valor de retorno, y para cualquier referencia no nula x, x.equals (null) debe devolver false
3. Know-how para lograr iguales de alta calidad
(1) Use el operador == para verificar si "el parámetro es una referencia a este objeto"
(2) Use el operador instanceof para verificar si "el parámetro es del tipo correcto"
(3) Para los atributos clave en la clase, verifique si los atributos de los parámetros pasados al objeto coinciden
(4) Después de escribir el método de igualdad, pregúntese si satisface la simetría, transitividad, consistencia
(5) Siempre reescribe el código hash cuando reescribir sea igual
(6) No reemplace el objeto Object en el parámetro igual método con otros tipos, y no olvide anotar @Override al reescribir
public boolean equals (Object obj) { // Determine el objeto actual y el objeto pasado if ( this == obj) { return true ; } // Determine si el objeto pasado es del tipo Person if (! (obj instanceof Person)) { return false ; } // Transforme obj a la referencia de Perosn, puede acceder al contenido único de Person, de lo contrario solo puede acceder al contenido común Person p = (Person) obj; devuelva este .age == p.age && this .name == p.name; }