El hashCode() predeterminado de Object devuelve la dirección de memoria para el objeto. Así que si usted tiene la siguiente clase:
class Car {
String make;
String model;
int year;
public Car(String make, String model, int year) {
this.make = make;
this.model = model;
this.year = year;
}
}
luego crear dos objetos:
Car car1 = new Car("Toyota", "Corolla", 2010);
Car car2 = new Car("Toyota", "Corolla", 2010);
car1.hashCode() será diferente de car2.hashCode(), ya que cada objeto tendrá una dirección de memoria diferente .
¿Qué sucede si quiere que tanto car1 como car2 devuelvan el mismo código hash? En este caso, se debe reemplazar el método hashCode predeterminado Object() de la clase de coche de la siguiente manera:
@Override
public int hashCode() {
Object[] x = {model, make, Integer.valueOf(year)};
int hashArray = Arrays.hashCode(x);
return hashArray;
}
Esto hará que car1.hashCode() igual a car2.hashCode() porque el String.hashCode() calcula el hashCode basado en el contenido de la cadena, y el Integer.hashCode() devolverá el valor entero mismo.
En Java 7, puede usar Objects.hash (Object ... values). Así que nuestro nuevo coche hashCode() se verá de la siguiente manera:
@Override
public int hashCode() {
return Objects.hash(model, make, year);
}
Objects.hash (del objeto ... valores) llamará Arrays.hashCode para usted.
Finalmente, Objects.hashCode (Object o) hará una comprobación nula. Devolverá 0 si el objeto es nulo. De lo contrario, llamará al método hashCode() de los objetos.
¿En qué situación 'hash (o)' y 'hashCode (o)' no devolverán el mismo valor? Los documentos para 'hash()' state 'Advertencia: cuando se proporciona una única referencia de objeto, el valor devuelto no es igual al código hash de esa referencia de objeto., Pero todavía estoy investigando para descubrir por qué. –