Di 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 de objeto? ¿Y qué son? ¿Cómo funcionarán los iguales predeterminados? ¿Cómo funcionará el código hash predeterminado y qué devolverá? == solo comprobará si hacen referencia al mismo objeto, por lo que es fácil, pero ¿qué pasa con los métodos equals () y hashCode ()?
v6u23 ea
:public native int hashCode();
Hay implementaciones predeterminadas de
equals()
yhashCode()
en Object. Si no proporciona su propia implementación, se utilizarán. Porqueequals()
esto significa una==
comparación: los objetos solo serán iguales si son exactamente el mismo objeto. PorquehashCode()
el Javadoc tiene una buena explicación.Para obtener más información, consulte Effective Java, Chapter 3 (pdf), item 8.
fuente
Sí, de la
Object
clase, ya que su clase extiende Object implícitamente.equals
simplemente regresathis == obj
.hashCode
la implementación es nativa. Solo una conjetura: devuelve el puntero al objeto.fuente
Si no proporciona su propia implementación, se utilizará una derivada de Object. Está bien, a menos que planee poner sus instancias de 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 contains () de HashSet). De lo contrario, funcionará incorrectamente, si eso es lo que está pidiendo.
Es bastante fácil proporcionar su propia implementación de estos métodos gracias a HashCodeBuilder y EqualsBuilder de Apache Commons Lang .
fuente
Foo
yBar
son referencias a dos instancias diferentes de un tipo mutable, y existe un método (por ejemploSomeMutatingMethod
) tal queFoo.SomeMutatingMethod()
no afecta deBar
la misma manera que lo haceFoo
, esa diferencia debería ser suficiente para considerar los objetos como desiguales.Developerworks de IBM dice:
Sin embargo, para estar seguro de los detalles exactos de implementación para la versión de Java de un proveedor en particular, probablemente sea mejor buscar como fuente (si está disponible)
fuente