Originariamente inviato da nourdine
io credevo che hashcode restituisse un id dell'oggetto stesso.
No, l'obiettivo di hashCode() è quello di fornire un valore che sia il più possibilmente "distinto" per oggetti diversi. Insomma, vedendola in modo diverso, l'obiettivo è quello di fornire valori che causino "collisioni" il meno possibile. Collisioni che comunque sono possibili, a seconda del modo di calcolare il hash code.

Prendiamo ad esempio Integer. Esso contiene un int. E il suo hashCode() ritorna direttamente quel int. Questo è un caso particolare in cui non ci sono collisioni (solo per Integer). Non è possibile che 2 Integer con valore diverso abbiano lo stesso hash code.
Prendiamo invece Long. Esso contiene un long ma hashCode() restituisce un int. Cosa fa il suo hashCode()? Fa uno XOR della parte alta con la parte bassa. Le collisioni quindi sono possibili. Due Long con valori diversi possono avere lo stesso hash code!!

codice:
Long a = new Long(0x0000000100000001L);
Long b = new Long(0x0000000500000005L);
System.out.println(a.hashCode() + "  " + b.hashCode());
Stampa 0 0. Ovvero stesso hash code anche se i Long hanno valore completamente diverso.