Bitte schauen Sie sich das Bild unten an. Wenn wir in Java ein Objekt mit dem new
Schlüsselwort erstellen , erhalten wir eine Speicheradresse vom Betriebssystem.
Wenn wir schreiben out.println(objName)
, können wir eine "spezielle" Zeichenfolge als Ausgabe sehen. Meine Fragen sind:
- Was ist diese Ausgabe?
Wenn es die Speicheradresse ist, die uns vom Betriebssystem gegeben wurde:
a) Wie kann ich diesen String in Binär konvertieren?
b) Wie kann ich eine Ganzzahlvariablenadresse erhalten?
Antworten:
Dies ist der Klassenname und System.identityHashCode (), die durch das Zeichen '@' getrennt sind. Was der Identitäts-Hash-Code darstellt, ist implementierungsspezifisch. Dies ist häufig die anfängliche Speicheradresse des Objekts, aber das Objekt kann von der VM im Laufe der Zeit im Speicher verschoben werden. Sie können sich also (kurz) nicht darauf verlassen, dass es etwas ist.
Das Abrufen der Speicheradressen von Variablen ist in Java bedeutungslos, da es der JVM freigestellt ist, Objekte zu implementieren und nach Belieben zu verschieben (Ihre Objekte können / werden sich während der Speicherbereinigung usw. bewegen).
Integer.toBinaryString () gibt Ihnen eine Ganzzahl in binärer Form.
quelle
identityHashcode
ist das nicht bedeutungslos, es ist einfach nicht narrensicher. :)Es ist möglich mit
sun.misc.Unsafe
: siehe diese großartige Antwort von @Peter Lawrey -> Gibt es eine Möglichkeit, eine Referenzadresse zu erhalten?Verwenden des Codes für printAddresses ():
Ich habe diesen Test eingerichtet:
Hier ist die Ausgabe:
Fazit :
quelle
Dies ist die Ausgabe der "toString ()" - Implementierung von Object. Wenn Ihre Klasse toString () überschreibt, wird etwas ganz anderes gedruckt.
quelle
Dies ist keine Speicheradresse. Dies ist Klassenname @ Hashcode
wo
Klassenname = vollständiger qualifizierter Name oder absoluter Name (dh Paketname gefolgt von Klassenname)
Hashcode = Hexadezimalformat (System.identityHashCode (obj) oder obj.hashCode () geben Ihnen Hashcode im Dezimalformat)
quelle
Wie Sunil sagte, ist dies keine Speicheradresse. Dies ist nur der Hashcode
Um den gleichen @ Inhalt zu erhalten, können Sie:
Wenn hashCode in dieser Klasse nicht überschrieben wird:
Wenn hashCode überschrieben wird, erhalten Sie den ursprünglichen Wert mit:
Dies wird häufig mit der Speicheradresse verwechselt, da die Speicheradresse zur Berechnung des Hash verwendet wird, wenn Sie hashCode () nicht überschreiben.
quelle
Was Sie erhalten, ist das Ergebnis der toString () -Methode der Object-Klasse oder genauer gesagt des identityHashCode (), wie uzay95 hervorgehoben hat.
"Wenn wir ein Objekt in Java mit einem neuen Schlüsselwort erstellen, erhalten wir eine Speicheradresse vom Betriebssystem."
Es ist wichtig zu wissen, dass alles, was Sie in Java tun, von der Java Virtual Machine verwaltet wird. Es ist die JVM, die diese Informationen gibt. Was tatsächlich im RAM des Host-Betriebssystems passiert, hängt vollständig von der Implementierung der JRE ab.
quelle
Dies ist nützlich, um über Hashcode in Java Bescheid zu wissen:
http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/
quelle
Wenn Sie in Java ein Objekt aus einer Klasse wie erstellen
Person p = new Person();
,p
ist dies tatsächlich eine Adresse eines Speicherorts, der auf einen Typ von verweistPerson
.Wenn
p
Sie zum Drucken ein Statemenet verwenden, wird eine Adresse angezeigt. Dasnew
Schlüsselwort erstellt einen neuen Speicherort, der alle darin enthaltenen Instanzvariablen und Methoden enthält,class Person
undp
ist die Referenzvariable, die auf diesen Speicherort verweist.quelle