Java'da obj.hashCode()
bir değer döndürür. Bu karma kodun programlamada kullanımı nedir?
Java'da obj.hashCode()
bir değer döndürür. Bu karma kodun programlamada kullanımı nedir?
Yanıtlar:
hashCode()
için kullanılan bucketing içinde Hash
gibi uygulamalarda HashMap
, HashTable
, HashSet
vs.
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.
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?
hashCode()
yöntemi manuel olarak çağırır ?
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 ,
hashCode
yö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şitsehashCode
, 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ıhashCode
farklı 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.)
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 .
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
, HashSet
vb mağaza nesnelere ihtiyacı kullanacağı hashCode
nesneyi 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.
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.
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
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));
}
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.