Cómo anular correctamente los métodos iguales y hashCode
En este artículo, le contaré mi comprensión de hashCode y métodos iguales. Discutiré sus implementaciones predeterminadas y cómo anularlas correctamente. También usaré el kit de herramientas proporcionado por Apache Commons para implementarlos.
Directorio:
Uso de hashCode() y equals()
Anulación de la implementación predeterminada
Uso del paquete hashCode( de Apache Commons Lang) ) y es igual a()
Cosas a las que debes prestar atención cuando usas ORM
Cosas a las que debes prestar especial atención cuando usas ORM
El hashCode() es definido en la clase Object) y es igual (), y la clase Object es la clase base de todas las clases de Java, por lo que todas las clases de Java heredan estos dos métodos.
Uso de hashCode() y equals()
El método hashCode() se utiliza para obtener un número entero único para un objeto determinado. Este número entero se utiliza para determinar dónde se almacena el objeto en una estructura similar a HashTable. De forma predeterminada, el método hashCode() de la clase de objeto devuelve el número de dirección de memoria de la ubicación donde está almacenado el objeto.
Anulación de la implementación predeterminada
Si no anula estos dos métodos, difícilmente enfrentará ningún problema, pero a veces el programa requiere que cambiemos alguna implementación predeterminada del objeto. .
Veamos este ejemplo, creemos una clase simple ¿Empleado?
empleado de clase pública
{
ID entero privado;
nombre de cadena privada;
apellido de cadena privada ;
Departamento de cadena privada;
Entero público getId() {
ID de retorno;
}
public void setId( ID entero) {
this.id = id;
}
cadena pública getFirstname() {
return nombre;
}
public void setFirstname(String nombre) {
this.firstname = nombre;
}
public String getLastName() {
return lastName;
p>}
public void setLastName(String apellido) {
this.lastName = lastName;
}
public String getDepartment() {
devolver departamento;
}
public void setDepartment(String departamento) {
this.department = departamento;
}
}
}
La clase Empleado anterior tiene solo algunas propiedades, captadores y definidores muy básicos.
out.println(e1.equals(e2));
}
}
No hay duda de que el programa anterior generará falso, pero de hecho , Los dos objetos anteriores representan la entrega de empleados. Para hacer esto, necesitamos sobrecargar el método igual.
público booleano es igual a(Objeto o) {
if (o == null)
{
return false;
}
si (o == esto)
{
devuelve verdadero;
}
if (getClass() != o.getClass())
{
return false;
}
Empleado e = (Empleado) o;
return (this.getId() == e.getId());
}
Agregue este método a la clase anterior, EauqlsTest salida verdadera. Entonces, ¿hemos terminado? Todavía no, veamos otra prueba.
importar java.util.HashSet;
importar java.util.Set;
clase pública EqualsTest
{
public static void main(String[] args)
{
Empleado e1 = nuevo Empleado();
Empleado e2 = nuevo Empleado() ;
e1.setId(100);
e2.setId(100);
// Imprimir "verdadero"
Sistema .out.println(e1.equals(e2));
Set
employees.add(e1); p> p>
employees.add(e2);
//Imprime dos objetos
System.out.println(employees);
} p>
El resultado del programa anterior es dos. Si dos objetos de empleado son equivalentes y devuelven verdadero, entonces solo se debe almacenar un objeto en la colección, entonces, ¿cuál es el problema? Olvidamos el segundo método importante, hashCode(). Como dice el JDK Javadoc, si sobrecarga el método equals(), debe anular el método hashCode(). Después de agregar el siguiente método, el programa se ejecutará correctamente.
@Override
public int hashCode()
{
final int PRIME = 31;
int resultado = 1;
resultado = PRIME * resultado + getId();
devolver resultado;
}
Usando Apache Commons Lang El paquete anula los métodos hashCode() y equals() El paquete Apache Commons proporciona dos clases excelentes para generar los métodos hashCode() y equals(). Consulte el procedimiento a continuación.
clase pública Empleado
{
ID entero privado;
nombre de cadena privada;
apellido de cadena privada;
Departamento de cadena privada;
getId público entero() {
ID de retorno;
}
ID setId vacío público (ID entero) {
this.id = id;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastName( ) {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName; p> p>
}
public String getDepartment() {
devolución departamento;
}
public void setDepartment( Departamento de cadena) {
this.department = departamento;
}
@Override
public int hashCode()
{
final int PRIME = 31;
devuelve nuevo HashCodeBuilder(getId()%2==0?getId()+1:getId(), PRIME).
toHashCode();
}
@Override
público booleano es igual a (Objeto o) {
si (o == nulo)
devuelve falso;
si (o == esto)
devuelve verdadero;
si ( o.getClass() ! = getClass())
devuelve falso;
Empleado e = (Empleado) o;
devuelve nuevo EqualsBuilder().
append(getId(), e.getId()).
isEquals();
}
}
}
1
Si está utilizando Eclipse u otro IDE, el IDE también puede proporcionar métodos hashCode() y equals() bien generados.