Java'da hashCode kullanımı nedir?


Yanıtlar:


222

hashCode()için kullanılan bucketing içinde Hashgibi uygulamalarda HashMap, HashTable, HashSetvs.

Alınan değer , setin / haritanın öğelerini saklamak için grup numarasıhashCode() olarak kullanılır . Bu grup numarası, kümenin / haritanın içindeki öğenin adresidir .

Bunu yaptığınızda contains(), öğenin karma kodunu alır, ardından karma kodun işaret ettiği kovayı arayın. Aynı grupta birden fazla öğe bulunursa (birden çok nesne aynı karma koduna sahip olabilir), equals()nesnelerin eşit olup olmadığını değerlendirmek için yöntemi kullanır ve sonra contains()doğru veya yanlış olup olmadığına karar verir veya öğenin sete eklendi ya da eklenmedi.


28
Merhaba Buddy .. Çok güzel bir cevap ama ben anlaması kolay pratik örnek ile aynı için çok ilginç bir bağlantı bulundu: coderanch.com/t/321515/java/java/HashCode
Logicalj

Teşekkürler Aishu. Şimdi kova ile ilgili açıklama içeren hashcode hakkında net bilgi sahibi oldum.
Balasubramani

2
"aynı grupta birden fazla eleman bulunursa .. o zaman equals()değerlendirmek için kullanır ", öyleyse yalnızca bir karma kod eşleşti öğesi bulunursa, doğrudan true değerini döndürür? ancak birden fazla nesne aynı karma koduna sahip olabileceğinden equals(), eşleşen öğenin eşit olup olmadığını değerlendirmek için çalıştırılması gerekir, aksi takdirde size beklenmedik bir sonuç verebilir, doğru mu?
Saorikido

Kovalar bir yana, hashcode, nesnenin her nesneyi bellekte saklama sırasını belirlemek için çağırdığı bir yöntemdir. Nesneler eşitse, bunların karma kodu da eşit olmalıdır. (bu ifadenin tersi yanlış)
NoName

1
Hangi durumda bir programcı hashCode()yöntemi manuel olarak çağırır ?
Kardinal - Monica'yı

33

Gönderen Javadoc :

Nesne için bir Hash kod değeri döndürür. Bu yöntem, tarafından sağlananlar gibi karma işlemlerin yararına desteklenir java.util.Hashtable.

Genel sözleşmesi hashCode:

  • Bir Java uygulamasının yürütülmesi sırasında aynı nesneye birden çok kez çağrıldığında, nesne üzerinde eşit karşılaştırmalarda kullanılan hiçbir bilgi değiştirilmediği sürece , hashCodeyöntem sürekli olarak aynı tamsayıyı döndürmelidir . Bu tamsayı, bir uygulamanın yürütülmesinden aynı uygulamanın başka bir uygulamasına kadar tutarlı kalmasına gerek yoktur.

  • İki nesne equals(Object)yönteme göre eşitse hashCode, iki nesnenin her birinde yöntemin çağrılması aynı tamsayı sonucunu üretmelidir.

  • Edilir değil iki nesne göre eşit değildir eğer gerekli equals(java.lang.Object)yöntem, o zaman çağrı hashCodefarklı tamsayı sonuçlar gereken iki nesnelerin her biri ile ilgili bir yöntem. Bununla birlikte, programcı eşit olmayan nesneler için farklı tamsayı sonuçları üretmenin hashtable'ların performansını artırabileceğinin farkında olmalıdır.

Oldukça pratik olduğu kadar, Object sınıfı tarafından tanımlanan hashCode yöntemi farklı nesneler için farklı tamsayılar döndürür. (Bu genellikle nesnenin dahili adresini bir tamsayıya dönüştürerek uygulanır, ancak bu uygulama tekniği Java programlama dili için gerekli değildir.)


14

Tarafından döndürülen değer hashCode(), nesnenin onaltılık sayıdaki bellek adresi olan hash kodudur.

Tanım olarak, iki nesne eşitse, bunların karma kodu da eşit olmalıdır. equals()Yöntemi geçersiz kılarsanız, iki nesnenin eşitlenme şeklini değiştirirsiniz ve Object'in uygulaması hashCode()artık geçerli olmaz. Bu nedenle, equals () yöntemini geçersiz kılarsanız, hashCode()yöntemi de geçersiz kılmanız gerekir .

Bu cevap java SE 8 resmi eğitim dokümanlarından alınmıştır.


13

hashCode()bir nesneyi alan ve sayısal bir değer veren bir işlevdir. Nesne değişmezse, bir nesnenin karma kodu her zaman aynıdır.

Fonksiyonlar gibi HashMap, HashTable, HashSetvb mağaza nesnelere ihtiyacı kullanacağı hashCodenesneyi saklamak ne "bellek konumu" (yani dizi pozisyonu) seçmek için kendi iç dizinin boyutunu modulo.

Çarpışmaların olabileceği bazı durumlar vardır (iki nesne aynı hashcode ile sonuçlanır) ve elbette dikkatli bir şekilde çözülmesi gerekir.


6

Hashcode iş mantığınızla hiçbir şey yapmasa da, çoğu durumda onunla ilgilenmeliyiz. Çünkü nesneniz karma tabanlı bir kaba (HashSet, HashMap ...) yerleştirildiğinde, kap öğenin hash kodunu koyar / alır.


Hayır değil. Anahtarı koyar / alır. HashCode sadece kovalama için kullanılır,
Lorne Marquis

3

Bir hashcode herhangi bir nesneden üretilen bir sayıdır.

Nesnelerin bir Hashtable içinde hızlı bir şekilde saklanmasına / alınmasına izin veren budur.

Aşağıdaki basit örneği düşünün :

Önünüzdeki masada. her biri 1 ile 9 arasında işaretlenmiş dokuz kutunuz vardır. Bu kutularda saklamak için bir sürü çılgınca farklı nesne yığınınız da vardır, ancak orada olduklarında bunları mümkün olan en kısa sürede bulmanız gerekir.

İhtiyacınız olan şey, her bir nesneyi hangi kutuya koyduğunuza anında karar vermenin bir yoludur. Bir dizin gibi çalışır. lahanayı bulmaya karar verirsiniz, böylece lahananın hangi kutuda olduğuna bakarsınız, sonra almak için doğrudan o kutuya gidin.

Şimdi, indeksle uğraşmak istemediğinizi, içinde bulunduğu nesneden hemen öğrenmek istediğinizi düşünün.

Örnekte, bunu yapmanın gerçekten basit bir yolunu kullanalım - nesnenin adındaki harf sayısı. Böylece lahana kutu 7'ye gider, bezelye kutu 3'e gider, kutu 6'daki roket, kutu 5'teki banjo vb.

Gergedanlar ne olacak? 10 karakterden oluşur, bu yüzden algoritmamızı biraz değiştiririz ve "etrafına sararız", böylece 10 harfli nesneler kutu 1'e, 11 kutu 2'ye 11 harf vb. Bu herhangi bir nesneyi kapsamalıdır.

Bazen bir kutunun içinde birden fazla nesne olabilir, ancak bir roket arıyorsanız, bir fıstık ve bir roketi karşılaştırmak, bir sürü lahana, bezelye, banjos ve gergedan yığınını kontrol etmekten daha hızlıdır.

Bu bir karma kod. Hashtable içinde saklanabilmesi için bir nesneden sayı almanın bir yolu. Java'da bir karma kodu herhangi bir tamsayı olabilir ve her nesne türü kendisinin oluşturulmasından sorumludur. Object'in "hashCode" yöntemini arayın.

Kaynak - burada


-1

HashCode () yönteminin kullanımlarından biri bir Yakalama mekanizması oluşturmaktır . Şu örneğe bakın:

        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));
}

'Yakalama mekanizması oluşturmak' ne demektir? Ve bu kod bunu nasıl gösteriyor?
Lorne Marquis

-1

hashCode()a, tek her nesne oluşturmak için JVM tarafından üretilen kod.

Biz kullanmak hashCode()hashmap vb Hashtable gibi ilgili karma algoritma bazı işlemi gerçekleştirmek için ..

hashCode()Arama işlemini kolaylaştırmanın avantajları , benzersiz kodu olan bir nesneyi aradığımızda, o nesneyi bulmaya yardımcı olur.

Ancak hashCode()bir nesnenin adresi olduğunu söyleyemeyiz . Her nesne için JVM tarafından üretilen benzersiz bir koddur.

Bu nedenle günümüzde hashing algoritması en popüler arama algoritmasıdır.


4
Hashcode benzersiz değil. 2 eşit olmayan nesne aynı karma kodu döndürebilir.
Ranielle Canlas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.