Ketika sebuah kelas di Java tidak menimpa kode hash () , mencetak sebuah instance dari kelas ini memberikan angka unik yang bagus.
Javadoc of Object mengatakan tentang kode hash () :
Sebanyak yang praktis, metode kode hash yang didefinisikan oleh Object class mengembalikan integer yang berbeda untuk objek yang berbeda.
Tetapi ketika kelas menimpa kode hash () , bagaimana saya bisa mendapatkan nomor uniknya?
Jawaban:
System.identityHashCode (yourObject) akan memberikan kode hash 'asli' dari yourObject sebagai integer. Keunikan belum tentu dijamin. Implementasi Sun JVM akan memberi Anda nilai yang terkait dengan alamat memori asli untuk objek ini, tapi itu detail implementasi dan Anda tidak harus bergantung padanya.
EDIT: Jawaban diubah mengikuti komentar Tom di bawah ini. alamat memori dan objek bergerak.
sumber
System.identityHashCode()
?Javadoc untuk Object menentukan itu
Jika sebuah kelas menimpa kode hash, itu berarti ia ingin menghasilkan id tertentu, yang (dapat berharap) memiliki perilaku yang benar.
Anda bisa menggunakan System.identityHashCode untuk mendapatkan id itu untuk kelas apa pun.
sumber
hashCode()
metode bukan untuk menyediakan pengidentifikasi unik untuk objek. Ini agak mencerna keadaan objek (yaitu nilai-nilai bidang anggota) ke integer tunggal. Nilai ini sebagian besar digunakan oleh beberapa struktur data berbasis hash seperti peta dan set untuk secara efektif menyimpan dan mengambil objek.Jika Anda membutuhkan pengenal untuk objek Anda, saya sarankan Anda untuk menambahkan metode Anda sendiri daripada mengganti
hashCode
. Untuk tujuan ini, Anda dapat membuat antarmuka dasar (atau kelas abstrak) seperti di bawah ini.Contoh penggunaan:
sumber
Mungkin solusi cepat dan kotor ini akan berhasil?
Ini juga memberikan jumlah instance kelas yang diinisialisasi.
sumber
System.identityHashCode
ini solusi yang lebih baikAtomicLong
seperti pada jawaban ini .Jika kelas yang bisa Anda modifikasi, Anda bisa mendeklarasikan variabel kelas
static java.util.concurrent.atomic.AtomicInteger nextInstanceId
. (Anda harus memberikannya nilai awal dengan cara yang jelas.) Kemudian deklarasikan variabel instanint instanceId = nextInstanceId.getAndIncrement()
.sumber
Saya datang dengan solusi ini yang berfungsi dalam kasus saya di mana saya memiliki objek yang dibuat pada banyak utas dan serializable:
sumber
Jika Anda melihat ke
hashcode
tipe Java ketika Anda melakukan.toString()
pada suatu objek kode yang mendasarinya adalah ini:sumber
Hanya untuk menambah jawaban lain dari sudut yang berbeda.
Jika Anda ingin menggunakan kembali kode hash dari 'di atas' dan mendapatkan yang baru menggunakan status immutatable kelas Anda, maka panggilan ke super akan berfungsi. Walaupun ini mungkin / mungkin tidak mengalir hingga Object (yaitu beberapa leluhur mungkin tidak memanggil super), ini akan memungkinkan Anda untuk mendapatkan kode hash dengan menggunakan kembali.
sumber
Ada perbedaan antara pengembalian hashCode () dan identityHashCode (). Ada kemungkinan bahwa untuk dua objek yang tidak sama (diuji dengan ==) o1, o2 hashCode () dapat sama. Lihat contoh di bawah ini bagaimana ini benar.
sumber
Saya memiliki masalah yang sama dan tidak puas dengan salah satu jawaban sejauh ini karena tidak satupun dari mereka yang menjamin ID unik.
Saya juga ingin mencetak objek ID untuk tujuan debugging. Saya tahu pasti ada beberapa cara untuk melakukannya, karena di Eclipse debugger, ini menentukan ID unik untuk setiap objek.
Saya datang dengan solusi berdasarkan pada kenyataan bahwa operator "==" untuk objek hanya mengembalikan true jika dua objek sebenarnya adalah contoh yang sama.
Saya percaya bahwa ini harus memastikan ID unik sepanjang masa program. Perhatikan, bagaimanapun, bahwa Anda mungkin tidak ingin menggunakannya dalam aplikasi produksi karena ia mempertahankan referensi ke semua objek yang Anda hasilkan ID. Ini berarti bahwa objek apa pun yang Anda buat ID tidak akan pernah menjadi sampah yang dikumpulkan.
Karena saya menggunakan ini untuk keperluan debug, saya tidak terlalu khawatir dengan memori yang dibebaskan.
Anda bisa memodifikasinya untuk memungkinkan membersihkan Obyek atau menghapus objek individual jika membebaskan memori menjadi masalah.
sumber