web-dev-qa-db-fra.com

Quelle est l'implémentation par défaut de `hashCode`?

Si l'on ne substitue pas la méthode hashCode, quelle est l'implémentation par défaut de hashCode?

54
John Threepwood

Ensuite, cette classe hérite de hashCode de l'un de ses ancêtres. Si aucune d'entre elles ne la remplace, alors Object.hashCode est utilisé.

De la docs :

Dans la mesure du possible, la méthode hashCode définie par la classe Object renvoie des entiers distincts pour des objets distincts. (Ceci est généralement implémenté en convertissant l'adresse interne de l'objet en un entier, mais cette technique d'implémentation n'est pas requise par le langage de programmation JavaTM.)

Donc, l'implémentation par défaut est spécifique à la machine virtuelle Java

49
default locale

Par défaut, les méthodes non remplacées sont héritées de Object.

Si vous consultez la documentation de cette méthode, les valeurs de retour sont "[...] distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer [...])". La méthode dans Java.lang.Object Est déclarée comme native, ce qui signifie que l'implémentation est fournie par la JVM et peut varier en fonction de votre environnement d'exécution.

Un petit exemple:

Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1.hashCode());
System.out.println(o2.hashCode());

impressions (en utilisant mon jdk6):

1660187542
516992923

Une représentation hexadécimale de la valeur hashCode() est utilisée dans l'implémentation par défaut de toString() au fait: Running System.out.println(o1) affiche quelque chose comme

Java.lang.Object@7a5e1077
15
f1sh

Object.hashcode () est une méthode native.

public native int hashCode();

Cela signifie qu'il est implémenté dans du code spécifique à la plate-forme et exposé en tant que méthode native.

le code pour la même chose sera un code compilé et non disponible avec JDK

this question existante pourrait fournir plus d’informations.

4
TheWhiteRabbit