L'hashCode() predefinito di Object restituisce l'indirizzo di memoria per l'oggetto. Quindi, se avete la seguente classe:
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;
}
}
quindi creare due oggetti:
Car car1 = new Car("Toyota", "Corolla", 2010);
Car car2 = new Car("Toyota", "Corolla", 2010);
car1.hashCode() sarà diverso da car2.hashCode(), perché ogni oggetto avrà un indirizzo di memoria diverso .
E se si desidera che sia car1 che car2 restituiscano lo stesso codice hash? In questo caso, è necessario eseguire l'override del metodo predefinito Object hashCode() per la classe auto come segue:
@Override
public int hashCode() {
Object[] x = {model, make, Integer.valueOf(year)};
int hashArray = Arrays.hashCode(x);
return hashArray;
}
Questo renderà car1.hashCode() pari a car2.hashCode() perché lo String.hashCode() calcola l'hashCode in base al contenuto della stringa e Integer.hashCode() restituirà il valore intero stesso.
In Java 7, è possibile utilizzare solo Objects.hash (oggetti ... valori). Così la nostra nuova hashCode Car() avrà il seguente aspetto:
@Override
public int hashCode() {
return Objects.hash(model, make, year);
}
Objects.hash (Object ... valori) chiamerà Arrays.hashCode per voi.
Infine, Objects.hashCode (Object o) eseguirà un controllo Null. Restituirà 0 se l'oggetto è nullo. Altrimenti, chiamerà il metodo hashCode() dell'oggetto.
In quale situazione "hash (o)" e "hashCode (o)" non restituiscono lo stesso valore? I documenti per 'hash()' state 'Attenzione: Quando viene fornito un riferimento a un singolo oggetto, il valore restituito non è uguale al codice hash di tale riferimento oggetto., Ma sto ancora scavando per capire perché. –