Apa gunanya kode hash di Jawa?

Jawaban:

222

hashCode()digunakan untuk bucketing di Hashimplementasi suka HashMap, HashTable, HashSet, dll

Nilai yang diterima dari hashCode()digunakan sebagai nomor ember untuk menyimpan elemen set / peta. Nomor ember ini adalah alamat elemen di dalam set / peta.

Ketika Anda melakukannya contains()akan mengambil kode hash elemen, lalu mencari ember di mana kode hash menunjuk. Jika lebih dari 1 elemen ditemukan dalam ember yang sama (beberapa objek dapat memiliki kode hash yang sama), maka ia menggunakan equals()metode untuk mengevaluasi apakah objek sama, dan kemudian memutuskan apakah contains()benar atau salah, atau memutuskan apakah elemen dapat menjadi ditambahkan di set atau tidak.

aish
sumber
28
Hai Sobat .. Jawaban yang sangat bagus tetapi saya menemukan tautan yang sangat menarik untuk hal yang sama dengan contoh praktis yang mudah dipahami: coderanch.com/t/321515/java/java/HashCode
Logicalj
Aishu terima kasih. Sekarang saya mendapat pengetahuan yang jelas tentang kode hash dengan penjelasan terkait ember.
Balasubramani
2
"Jika lebih dari 1 elemen ditemukan dalam bucket yang sama .. maka ia menggunakan equals()untuk mengevaluasi", jadi bagaimana jika hanya ada satu kode hash yang cocok dengan elemen yang ditemukan, ia mengembalikan true secara langsung? tetapi karena beberapa objek dapat memiliki kode hash yang sama sehingga harus dijalankan equals()untuk mengevaluasi jika elemen yang cocok sama, kalau tidak, ini dapat memberi Anda hasil yang tidak terduga, apakah saya benar?
Saorikido
Di samping bucket, kode hash adalah metode yang objek panggilan untuk menentukan urutan untuk menyimpan setiap objek dalam memori. Jika objek sama, maka kode hashnya juga harus sama. (kebalikan dari pernyataan ini salah)
NoName
1
Dalam hal apa seorang programmer akan secara manual memanggil hashCode()metode ini?
Kardinal - Reinstate Monica
33

Dari Javadoc :

Mengembalikan nilai kode hash untuk objek. Metode ini didukung untuk kepentingan hashtable seperti yang disediakan oleh java.util.Hashtable.

Kontrak umum hashCodeadalah:

  • Setiap kali itu dipanggil pada objek yang sama lebih dari sekali selama eksekusi aplikasi Java, hashCodemetode harus secara konsisten mengembalikan integer yang sama , asalkan tidak ada informasi yang digunakan dalam perbandingan yang sama pada objek yang dimodifikasi. Bilangan bulat ini tidak harus tetap konsisten dari satu eksekusi aplikasi ke eksekusi aplikasi yang sama.

  • Jika dua objek sama menurut equals(Object)metode, maka memanggil hashCodemetode pada masing-masing dua objek harus menghasilkan hasil bilangan bulat yang sama.

  • Hal ini tidak diperlukan bahwa jika dua benda yang tidak sama sesuai dengan equals(java.lang.Object)metode, kemudian memanggil hashCodemetode pada masing-masing dua benda harus menghasilkan hasil bilangan bulat yang berbeda. Namun, programmer harus menyadari bahwa menghasilkan hasil integer yang berbeda untuk objek yang tidak sama dapat meningkatkan kinerja dari hashtables.

Sejauh praktis, metode hashCode yang didefinisikan oleh Object class mengembalikan integer yang berbeda untuk objek yang berbeda. (Ini biasanya diterapkan dengan mengubah alamat internal objek menjadi integer , tetapi teknik implementasi ini tidak diperlukan oleh bahasa pemrograman Java.)

John Topley
sumber
14

Nilai yang dikembalikan oleh hashCode()adalah kode hash objek, yang merupakan alamat memori objek dalam heksadesimal.

Menurut definisi, jika dua objek sama, kode hash mereka juga harus sama. Jika Anda mengganti equals()metode, Anda mengubah cara dua objek disamakan dan implementasi objek hashCode()tidak lagi valid. Oleh karena itu, jika Anda mengganti metode equals (), Anda juga harus mengganti hashCode()metode tersebut.

Jawaban ini dari dokumentasi tutorial resmi Java SE 8

Eli
sumber
13

hashCode()adalah fungsi yang mengambil objek dan menampilkan nilai numerik. Kode hash untuk suatu objek selalu sama jika objek tidak berubah.

Fungsi seperti HashMap, HashTable, HashSet, dll yang perlu ke toko obyek akan menggunakan hashCodemodulo ukuran array internal mereka untuk memilih apa "posisi memori" (yaitu posisi array) untuk menyimpan objek.

Ada beberapa kasus di mana tabrakan dapat terjadi (dua objek berakhir dengan kode hash yang sama), dan itu, tentu saja, perlu dipecahkan dengan hati-hati.

roottraveller
sumber
6

Meskipun kode hash tidak melakukan apa pun dengan logika bisnis Anda, kami harus menjaganya dalam banyak kasus. Karena ketika objek Anda dimasukkan ke dalam wadah berbasis hash (HashSet, HashMap ...), wadah menempatkan / mendapat kode hash elemen.

卢 声 远 Shengyuan Lu
sumber
Tidak, tidak. Ini menempatkan / mendapatkan kuncinya. Kode hash hanya digunakan untuk bucketing,
Marquis of Lorne
3

Sebuah kode hash adalah nomor yang dihasilkan dari objek apapun.

Inilah yang memungkinkan objek untuk disimpan / diambil dengan cepat di Hashtable.

Bayangkan contoh sederhana berikut ini :

Di atas meja di depan Anda. Anda memiliki sembilan kotak, masing-masing ditandai dengan angka 1 hingga 9. Anda juga memiliki tumpukan benda yang sangat berbeda untuk disimpan dalam kotak-kotak ini, tetapi begitu mereka berada di sana, Anda harus dapat menemukannya secepat mungkin.

Yang Anda butuhkan adalah cara untuk secara instan memutuskan kotak tempat Anda meletakkan setiap objek. Ini berfungsi seperti indeks. Anda memutuskan untuk menemukan kubis sehingga Anda mencari di kotak mana kubis berada, lalu langsung ke kotak itu untuk mendapatkannya.

Sekarang bayangkan Anda tidak ingin repot dengan indeks, Anda ingin dapat segera mengetahui dari objek di mana kotak itu hidup.

Dalam contoh, mari kita gunakan cara yang sangat sederhana untuk melakukan ini - jumlah huruf atas nama objek. Jadi kubis masuk kotak 7, kacang polong masuk kotak 3, roket di kotak 6, banjo di kotak 5 dan seterusnya.

Bagaimana dengan badak? Ini memiliki 10 karakter, jadi kami akan sedikit mengubah algoritme kami dan "membungkus" sehingga objek 10 huruf masuk ke kotak 1, 11 huruf di kotak 2 dan seterusnya. Itu harus mencakup objek apa pun.

Kadang-kadang sebuah kotak memiliki lebih dari satu objek di dalamnya, tetapi jika Anda mencari roket, masih jauh lebih cepat untuk membandingkan kacang dan roket, daripada memeriksa seluruh tumpukan kubis, kacang polong, banjo, dan badak.

Itu kode hash. Cara mendapatkan nomor dari suatu objek sehingga dapat disimpan dalam Hashtable. Di Jawa, kode hash bisa berupa bilangan bulat apa pun, dan setiap jenis objek bertanggung jawab untuk menghasilkan sendiri. Cari metode "hashCode" dari Object.

Sumber - di sini

Satyajit Das
sumber
-1

Salah satu kegunaan hashCode () adalah membangun mekanisme Penangkapan . Lihatlah contoh ini:

        class Point
    {
      public int x, y;

      public Point(int x, int y)
      {
        this.x = x;
        this.y = y;
      }

      @Override
      public boolean equals(Object o)
      {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Point point = (Point) o;

        if (x != point.x) return false;
        return y == point.y;
      }

      @Override
      public int hashCode()
      {
        int result = x;
        result = 31 * result + y;
        return result;
      }

class Line
{
  public Point start, end;

  public Line(Point start, Point end)
  {
    this.start = start;
    this.end = end;
  }

  @Override
  public boolean equals(Object o)
  {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Line line = (Line) o;

    if (!start.equals(line.start)) return false;
    return end.equals(line.end);
  }

  @Override
  public int hashCode()
  {
    int result = start.hashCode();
    result = 31 * result + end.hashCode();
    return result;
  }
}
class LineToPointAdapter implements Iterable<Point>
{
  private static int count = 0;
  private static Map<Integer, List<Point>> cache = new HashMap<>();
  private int hash;

  public LineToPointAdapter(Line line)
  {
    hash = line.hashCode();
    if (cache.get(hash) != null) return; // we already have it

    System.out.println(
      String.format("%d: Generating points for line [%d,%d]-[%d,%d] (no caching)",
        ++count, line.start.x, line.start.y, line.end.x, line.end.y));
}
Sudabe-Neirizi
sumber
Apa yang dimaksud dengan 'membangun mekanisme penangkapan'? Dan bagaimana kode ini menggambarkannya?
Marquis of Lorne
-1

hashCode()adalah kode unik yang dihasilkan oleh JVM untuk setiap pembuatan objek.

Kami menggunakan hashCode()untuk melakukan beberapa operasi pada hashing algoritma terkait seperti Hashtable, Hashmap dll.

Keuntungan dari hashCode()membuat operasi pencarian menjadi mudah karena ketika kita mencari objek yang memiliki kode unik, ada baiknya untuk mengetahui objek itu.

Tapi kita tidak bisa mengatakan hashCode()alamat suatu objek. Ini adalah kode unik yang dihasilkan oleh JVM untuk setiap objek.

Itulah sebabnya algoritma hashing saat ini adalah algoritma pencarian yang paling populer.

pritish sahu
sumber
4
Hashcode tidak unik. 2 objek yang tidak sama mungkin mengembalikan kode hash yang sama.
Ranielle Canlas