Wann sollten die System.identityhashcode () - und die hashcode () -Methode verwendet werden?

8
  

Wann wird die System.identityhashcode () - und die hashcode () -Methode verwendet? *

    
Srinivas Vasu 23.07.2015, 06:27
quelle

5 Antworten

2

Laut javadoc, System.identityHashCode(Object o) :

  

Gibt den gleichen Hash-Code für das angegebene Objekt zurück, wie er von der Standardmethode hashCode () zurückgegeben würde, unabhängig davon, ob die Klasse des angegebenen Objekts hashCode () überschreibt oder nicht. Der Hash-Code für die Nullreferenz ist Null.

Also wird System.identityHashCode(nullReference) Ihnen an erster Stelle immer 0 geben, anstatt nullReference.hashCode() , was Ihnen offensichtlich ein NullPointerException zur Laufzeit gibt.

Betrachten wir jedoch die folgende Klasse:

%Vor%

Die Klasse überschreibt hashCode() , was vollkommen in Ordnung ist, obwohl der Hash-Code für jede Instanz derselbe wäre, was jedoch nicht gut ist, wenn Sie Identitäten mehrerer Instanzen unterscheiden wollen. Normalerweise würden Sie die Ausgabe der Methode .toString() (die standardmäßig den Klassennamen angibt, gefolgt von @ gefolgt von der Ausgabe hashCode() ) verwenden, um beispielsweise die wahre Identität eines Objekts herauszufinden. Aber in diesem Fall wäre die Ausgabe gleich:

%Vor%

Die Ausgabe wäre:

%Vor%

Eine solche Implementierung von hashCode() kann also nicht zwischen Identitäten mehrerer Instanzen unterscheiden. Wo ist System.identityHashCode() ist praktisch.

Wenn Sie das tun

%Vor%

Sie erhalten zwei verschiedene Zahlen für die verschiedenen Instanzen, obwohl die hashCode() ihrer Klassenimplementierung eine Konstante zurückgibt (tatsächlich wird hier die überschriebene Implementierung von hashCode() überhaupt nicht aufgerufen, wie in javadoc):

%Vor%

Außerdem können Sie Grundelemente sogar an System.identityHashCode(Object o) übergeben, da sie an die entsprechenden Wrapper gebunden werden:

%Vor%

Weitere Informationen:

Konstantin Yovkov 23.07.2015 06:53
quelle
0

Aus der Dokumentation :

  

public static int identityHashCode (Objekt x)

     

Gibt den gleichen Hash-Code für das angegebene Objekt zurück, wie er von der Standardmethode hashCode () zurückgegeben würde, unabhängig davon, ob die Klasse des angegebenen Objekts hashCode () überschreibt oder nicht. Der Hash-Code für die Nullreferenz ist Null.

Beachten Sie, dass identityHashCode das hashCode wie in der Klasse Object implementiert zurückgibt und das ist nicht das, was Sie normalerweise wollen, also sollten Sie einfach yourObject.hashCode() verwenden.

Wenn es ein paar Anwendungsfälle für diese Methode gibt, wenn Sie ein Array von Objects haben, das Sie durchlaufen, könnte ein null drin sein, und Sie benötigen hashCode dieser Objekte mit System.identityHashCode(obj) könnte einen Null-Check speichern, nicht so groß wie eine Verbesserung.

    
Umberto Raimondi 23.07.2015 06:45
quelle
0

Einige Ihrer Klassen überschreiben möglicherweise hashcode() method in Ihrem System. Für diese Objekte stellt diese Methode den Hash-Code des bereitgestellten Objekts bereit, der von seinem letzten übergeordneten java.lang.Object zurückgegeben würde. Siehe Java API siehe die Beschreibung von Sprachdesignern.

Ich glaube, die Verwendung ist, wenn Sie aus bestimmten Gründen fast nicht eindeutige Objekte erstellen möchten. Wenn ich fast sage, kann es Objekte mit demselben Hash-Code geben. Sie würden tatsächlich die Verwendung von equals Methoden minimieren.

    
sakthisundar 23.07.2015 06:45
quelle
0

Die System.identityhashcode () gibt immer die standardmäßige java.lang.Object-Implementierung zurück, auch wenn die Klasse für ein bestimmtes Objekt diese überschreibt und einen anderen Hash-Code berechnet.

Unter bestimmten Umständen benötigen Sie diese Definition: Zwei Objekte o1 und o2 gelten genau dann als gleich, wenn o1 == o2. In normalen Implementierungen werden zwei Objekte o1 und o2 genau dann als gleich angesehen, wenn o1 == null? o2 == null: o1.equals (o2). Wenn zwei Objekte genau dann gleich sind, wenn o1 == o2, müssen sie denselben Hashcode haben. Also sollten Sie System.identityhashcode () verwenden.

Hier sind einige Codeschnipsel, die ich gefunden habe.

%Vor%

IdentityHashMap.java

%Vor%

IdentityWrapper.java (Von Apache Commons Pool 2)

    
sofia 13.09.2017 05:43
quelle
-1

Nun, für den Anfang, während System natürlich eine hashCode() -Methode hat (jedes Objekt hat eine), sehe ich keinen Grund, es anzurufen. Oder irgendeine Chance, dass ein System-Objekt es aufruft, da System final und der Konstruktor private ist. Also, wahrscheinlich "ziemlich nie" für hashCode() , denke ich.

Also bleibt uns System.identityHashCode(Object) , was Ihnen einfach den Standard-Hashcode-Wert für jedes Objekt gibt. Mit anderen Worten, Sie brauchen es nicht sehr oft, denn wenn Sie die hashCode () - Methode in Ihrer Klasse nicht überschreiben, erhalten Sie für Ihre Objekte standardmäßig den gleichen Rückgabewert (weil effektiv der standardmäßige hashCode (), wenn Sie die Methode hashCode () nicht überschrieben haben, ist einfach System.identityHashCode(this) ). Es kann einige Anwendungsfälle geben, wenn es verwendet wird, aber sie sind ziemlich selten.

    
Florian Schaetz 23.07.2015 06:39
quelle

Tags und Links