java - metodo - ¿Cómo funcionarán.equals y.hashCode por defecto para mis clases?
metodo hash java (6)
Digamos que tengo mi propia clase
public class MyObj { /* ... */ }
Tiene algunos atributos y métodos. NO implementa iguales, NO implementa hashCode.
Una vez que llamamos equals y hashCode, ¿cuáles son las implementaciones predeterminadas? De la clase Object? ¿Y qué son? ¿Cómo funcionará el valor predeterminado? ¿Cómo funcionará el hashCode predeterminado y qué devolverá? == simplemente comprobará si hacen referencia al mismo objeto, por lo que es fácil, pero ¿qué pasa con los métodos equals () y hashCode ()?
Desde Object
en una de las implementaciones de JVM:
public boolean equals(Object object) {
return this == object;
}
public int hashCode() {
return VMMemoryManager.getIdentityHashCode(this);
}
En ambos casos, solo se trata de comparar las direcciones de memoria de los objetos en cuestión.
Hay implementaciones predeterminadas de equals()
y hashCode()
en Object. Si no proporciona su propia implementación, se usarán. Para equals()
, esto significa una ==
comparación: los objetos solo serán iguales si son exactamente el mismo objeto. Para hashCode()
, el Javadoc tiene una buena explicación.
Para obtener más información, vea Java efectivo, Capítulo 3 (pdf), elemento 8.
Sí, desde la clase Object
, ya que su clase extiende Object implícitamente. equals
simplemente devuelve this == obj
. hashCode
implementación de hashCode
es nativa. Solo supongo que devuelve el puntero al objeto.
Sí, la implementación predeterminada es Object (en términos generales, si heredas de una clase que redefinió equals y / o hashCode, entonces usarás esa implementación en su lugar).
De la documentación:
El método equals para la clase Object implementa la relación de equivalencia más discriminatoria posible en los objetos; es decir, para cualquier valor de referencia no nulo x e y, este método devuelve verdadero si y solo si xey se refieren al mismo objeto (x == y tiene el valor verdadero).
Tanto como sea razonablemente práctico, el método hashCode definido por el objeto de clase devuelve enteros distintos para objetos distintos. (Esto se implementa típicamente al convertir la dirección interna del objeto en un entero, pero esta técnica de implementación no es requerida por el lenguaje de programación JavaTM).
Si no proporciona su propia implementación, se utilizará una derivada de Object. Está bien, a menos que planee poner las instancias de su clase en, por ejemplo, HashSet (cualquier colección que realmente use hashCode ()), o algo que necesite verificar la igualdad del objeto (es decir, el método HashSet contiene ()). De lo contrario, funcionará incorrectamente, si eso es lo que estás pidiendo.
Es bastante fácil proporcionar su propia implementación de estos métodos gracias a HashCodeBuilder y EqualsBuilder de Apache Commons Lang .
developerworks de IBM dice:
Bajo esta implementación predeterminada, dos referencias son iguales solo si se refieren al mismo objeto exacto. De forma similar, la implementación predeterminada de hashCode () proporcionada por Object se deriva al asignar la dirección de memoria del objeto a un valor entero.
Sin embargo, para estar seguro de los detalles de implementación exactos para la versión de Java de un proveedor en particular, es probable que sea mejor buscarla como fuente (si está disponible).