Metoda hashCode()

 

Metoda hashCode() zwraca unikalną wartość typu int dla każdego unikalnego obiektu. Obiekt jest unikalny, jeśli metoda equals() zwraca false przy porównaniu z każdym innym obiektem. Dla dwóch obiektów, dla których metoda equals() zwraca true, metoda hashCode() powinna zwracać tę samą wartość.

Jest to metoda klasy java.lang.Object.

 

Metoda hashCode() jest używana odnośnie struktur danych, w których wykorzystane są tablice mieszające (ang. hashtable) - np. zbiorach (hashSet) oraz mapach (hashMap). Aby te struktury danych mogły działać poprawnie, metoda hashCode() musi zwracać różne wartości dla różnych obiektów.

Przykładowo w strukturze zboiru (hashSet) jeśli dla dwóch różnych obiektów metoda hashCode() zwróci tę samą wartość, wówczas obiekty te będą traktowane jako duplikat i jeden z nich nie zostanie dodany do zbioru.

 

public class HashCodeExample {
    public static void main(String[] args) {
        String str1 = new String( "Ala" );
        String str2 = new String( "Ala" );
        System.out.println( "str1.equals(str2): " + str1.equals(str2) );	//true
        System.out.println( "str1 hashCode: " + str1.hashCode() ); //65910
        System.out.println( "str2 hashCode: " + str2.hashCode() ); //65910

        MojaKlasa object1 = new MojaKlasa( "Nazwa", 222 );
        MojaKlasa object2 = new MojaKlasa( "Nazwa", 222 );
        System.out.println( "object1.equals(object2): " + object1.equals(object2) );	//false
        System.out.println( "object1 hashCode: " + object1.hashCode() ); //2018699554
        System.out.println( "object2 hashCode: " + object2.hashCode() ); //1311053135
    }
}

class MojaKlasa {
    String name;
    double value;
     
    public MojaKlasa( String name, int value ) {
        this.name = name;
        this.value = value;
    }
}

 

Aby uniknąć duplikowania obiektów, które w rzeczywistości mają tę samą zawartość - treść, należy utworzyć własną implementację metody hashCode(), nadpisując oryginalną metodę klasy java.lang.Object.

Przykład metody hashCode() wygenerowanej przy użyciu programu Eclipse - za pomocą funkcji Source → Generate hashCode (w programach Intelli J IDEA lub NetBeans metoda ta będzie wyglądała inaczej):

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    long temp;
    temp = Double.doubleToLongBits( value );
    result = prime * result + (int) (temp ^ (temp >>> 32));
    return result;
}

Do wyliczenia zwracanej wartości użyte zostały wartości name oraz value. Istnieją różne algorytmy wyliczania wartości hashCode. Cechą wspólną jest wykorzystanie w nich liczby pierwszej o wartości większej niż 31, następnie wykonanie odpowiedniego przesunięcia bitowego.