Silakan lihat gambar di bawah ini. Saat kita membuat objek di java dengan new
kata kunci, kita mendapatkan alamat memori dari OS.
Ketika kita menulis out.println(objName)
kita dapat melihat string "khusus" sebagai keluaran. Pertanyaan saya adalah:
- Apa keluaran ini?
Jika itu adalah alamat memori yang diberikan oleh OS kepada kami:
a) Bagaimana cara mengubah string ini menjadi biner?
b) Bagaimana saya bisa mendapatkan satu alamat variabel integer?
Jawaban:
Itu adalah nama kelas dan System.identityHashCode () yang dipisahkan oleh karakter '@'. Apa yang diwakili oleh kode hash identitas adalah spesifik-implementasi. Ini sering kali merupakan alamat memori awal dari objek, tetapi objek dapat dipindahkan ke memori oleh VM dari waktu ke waktu. Jadi (secara singkat) Anda tidak bisa mengandalkannya sebagai apa pun.
Mendapatkan alamat memori variabel tidak ada artinya di dalam Java, karena JVM bebas mengimplementasikan objek dan memindahkannya sesuai keinginan (objek Anda mungkin / akan berpindah-pindah selama pengumpulan sampah, dll.)
Integer.toBinaryString () akan memberi Anda integer dalam bentuk biner.
sumber
identityHashcode
ini, tidak ada artinya, hanya saja tidak bisa dibilang sangat mudah. :)Hal ini dimungkinkan dengan menggunakan
sun.misc.Unsafe
: lihat jawaban hebat ini dari @Peter Lawrey -> Apakah ada cara untuk mendapatkan alamat referensi?Menggunakan kodenya untuk printAddresses ():
public static void printAddresses(String label, Object... objects) { System.out.print(label + ": 0x"); long last = 0; int offset = unsafe.arrayBaseOffset(objects.getClass()); int scale = unsafe.arrayIndexScale(objects.getClass()); switch (scale) { case 4: long factor = is64bit ? 8 : 1; final long i1 = (unsafe.getInt(objects, offset) & 0xFFFFFFFFL) * factor; System.out.print(Long.toHexString(i1)); last = i1; for (int i = 1; i < objects.length; i++) { final long i2 = (unsafe.getInt(objects, offset + i * 4) & 0xFFFFFFFFL) * factor; if (i2 > last) System.out.print(", +" + Long.toHexString(i2 - last)); else System.out.print(", -" + Long.toHexString( last - i2)); last = i2; } break; case 8: throw new AssertionError("Not supported"); } System.out.println(); }
Saya menyiapkan tes ini:
//hashcode System.out.println("Hashcode : "+myObject.hashCode()); System.out.println("Hashcode : "+System.identityHashCode(myObject)); System.out.println("Hashcode (HEX) : "+Integer.toHexString(myObject.hashCode())); //toString System.out.println("toString : "+String.valueOf(myObject)); printAddresses("Address", myObject);
Inilah hasilnya:
Hashcode : 125665513 Hashcode : 125665513 Hashcode (HEX) : 77d80e9 toString : java.lang.Object@77d80e9 Address: 0x7aae62270
Kesimpulan:
sumber
Itu adalah output dari implementasi "toString ()" Object. Jika kelas Anda mengganti toString (), itu akan mencetak sesuatu yang sama sekali berbeda.
sumber
Ini bukan alamat memori Ini adalah classname @ hashcode
dimana
classname = nama lengkap yang memenuhi syarat atau nama absolut (yaitu nama paket diikuti dengan nama kelas)
hashcode = format heksadesimal (System.identityHashCode (obj) atau obj.hashCode () akan memberi Anda kode hash dalam format desimal)
sumber
Seperti yang dikatakan Sunil, ini bukan alamat memori, ini hanya kode hash
Untuk mendapatkan @ konten yang sama, Anda dapat:
Jika hashCode tidak diganti di kelas itu:
"@" + Integer.toHexString(obj.hashCode())
Jika hashCode diganti, Anda mendapatkan nilai asli dengan:
"@" + Integer.toHexString(System.identityHashCode(obj))
Ini sering dibingungkan dengan alamat memori karena jika Anda tidak menimpa hashCode (), alamat memori digunakan untuk menghitung hash.
sumber
Apa yang Anda dapatkan adalah hasil dari metode toString () dari kelas Object atau, lebih tepatnya, identityHashCode () seperti yang ditunjukkan oleh uzay95.
"Saat kami membuat objek di java dengan kata kunci baru, kami mendapatkan alamat memori dari OS."
Penting untuk disadari bahwa semua yang Anda lakukan di Java ditangani oleh Java Virtual Machine. JVMlah yang memberikan informasi ini. Apa yang sebenarnya terjadi dalam RAM sistem operasi host bergantung sepenuhnya pada implementasi JRE.
sumber
ini berguna untuk mengetahui tentang kode hash di java:
http://eclipsesource.com/blogs/2012/09/04/the-3-things-you-should-know-about-hashcode/
sumber
Di Java, saat Anda membuat objek dari kelas sejenis
Person p = new Person();
,p
sebenarnya adalah alamat lokasi memori yang mengarah ke tipePerson
.Saat menggunakan statemenet untuk mencetak,
p
Anda akan melihat alamat. Katanew
kunci membuat lokasi memori baru yang berisi semua variabel dan metode instan yang termasuk dalamclass Person
danp
merupakan variabel referensi yang menunjuk ke lokasi memori tersebut.sumber