Uzun bir cevap olacak, bir içki alıp okumaya devam edecek…
Karma, daha hızlı okunabilen ve yazılabilen bir anahtar / değer çiftini bellekte saklamakla ilgilidir. Anahtarları bir dizide ve değerleri LinkedList'te saklar.
4 anahtar değer çifti saklamak istediğimi varsayalım -
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
Bu yüzden anahtarları saklamak için 4 öğeden oluşan bir diziye ihtiyacımız var. Şimdi bu 4 anahtardan birini 4 dizi dizinine (0,1,2,3) nasıl eşleyebilirim?
Böylece java, ayrı anahtarların hashCode'unu bulur ve bunları belirli bir dizi dizinine eşler. Hashcode Formülleri -
1) reverse the string.
2) keep on multiplying ascii of each character with increasing power of 31 . then add the components .
3) So hashCode() of girl would be –(ascii values of l,r,i,g are 108, 114, 105 and 103) .
e.g. girl = 108 * 31^0 + 114 * 31^1 + 105 * 31^2 + 103 * 31^3 = 3173020
Hash ve kız !! Ne düşündüğünü biliyorum. O vahşi düete olan ilginiz sizi önemli bir şeyi özlüyor olabilir.
Java neden 31 ile çarpıyor?
Çünkü 31, 2 ^ 5 - 1 biçiminde garip bir asaldır. Ve tek başbakan Karma Çarpışma olasılığını azaltır
Şimdi bu karma kodu bir dizi dizinine nasıl eşlenir?
cevap Hash Code % (Array length -1)
,. Yani “girl”
eşleştirilmiş (3173020 % 3) = 1
bizim durumumuzda. dizinin ikinci öğesidir.
ve “ahhan” değeri dizi dizini 1 ile ilişkili bir LinkedList içinde saklanır.
HashCollision - hasHCode
Anahtarları bulmaya “misused”
ve “horsemints”
yukarıda açıklanan formülleri kullanmaya çalışırsanız, her ikisinin de bize aynı şeyi verdiğini görürsünüz 1069518484
. Whooaa !! çıkarılan ders -
2 eşit nesnenin aynı hashCode'u olmalıdır, ancak hashCode eşleşirse nesneler eşitse garanti yoktur. Bu nedenle, kova 1'e “yanlış kullanılmış” ve “at binicileri” ne karşılık gelen her iki değeri de saklamalıdır (1069518484% 3).
Şimdi karma harita şu şekilde görünüyor -
Array Index 0 –
Array Index 1 - LinkedIst (“ahhan” , “Manmohan Singh” , “guess what”)
Array Index 2 – LinkedList (“way”)
Array Index 3 –
Şimdi bazı gövde anahtarın değerini bulmaya çalışırsa “horsemints”
, java hızlı bir şekilde hashCode'unu bulur, modülleştirir ve buna karşılık gelen LinkedList'te değerini aramaya başlar index 1
. Bu şekilde, 4 dizi dizininin tümünü aramamıza gerek kalmaz, böylece veri erişimini daha hızlı hale getiririz.
Ama, bir saniye. LinkedList'e karşılık gelen Array indeksi 1'de 3 değer vardır, anahtar “atlılar” için hangisinin değer olduğunu nasıl bulur?
Aslında, yalan söyledim, HashMap sadece LinkedList değerleri depolar dedi.
Her iki anahtar / değer çiftini harita girişi olarak saklar. Aslında Harita buna benziyor.
Array Index 0 –
Array Index 1 - LinkedIst (<”girl” => “ahhan”> , <” misused” => “Manmohan Singh”> , <”horsemints” => “guess what”>)
Array Index 2 – LinkedList (<”no” => “way”>)
Array Index 3 –
Artık, ArrayIndex1'e karşılık gelen LinkedList üzerinden geçiş yaparken, bu LinkedList'in her girişinin anahtarını “at binicileri” ile karşılaştırır ve bir tane bulduğunda bunun değerini döndürür.
Umarım okurken eğlenmişsinizdir :)