Hashing Nedir?
Bir nesneyi tam sayı değerine dönüştürme işlemidir. Tamsayı değeri indekslemeye ve daha hızlı aramalara yardımcı olur.
HashMap Nedir?
HashMap, Java toplama çerçevesinin bir parçasıdır. Hashing adı verilen bir teknik kullanır. Harita arayüzünü uygular. Verileri Anahtar ve Değer çiftinde saklar. HashMap bir dizi düğüm içerir ve düğüm bir sınıf olarak temsil edilir. Anahtar ve Değeri depolamak için dahili olarak bir dizi ve LinkedList veri yapısını kullanır. HashMap'te dört alan vardır.
HashMap'in iç işleyişini anlamadan önce hashCode() ve equals() yöntemleri hakkında bilgi sahibi olmalısınız.
'mason' formülü'
HashMap'e Anahtar ve Değer çiftini ekleyin
HashMap'e Anahtar ve Değer çiftini eklemek için put() yöntemini kullanıyoruz. HashMap'in varsayılan boyutu 16'dır (0 ila 15).
Örnek
Aşağıdaki örnekte HashMap'e üç (Anahtar, Değer) çifti eklemek istiyoruz.
HashMap map = new HashMap(); map.put('Aman', 19); map.put('Sunny', 29); map.put('Ritesh', 39);
Anahtar, değer çiftinin HashMap'e hangi indekste kaydedileceğini görelim. put() metodunu çağırdığımızda 'Aman' anahtarının hash kodunu hesaplar. 'Aman'ın karma kodunun 2657860 olduğunu varsayalım. Anahtarı hafızada saklamak için endeksi hesaplamamız gerekir.
Endeks Hesaplanıyor
Index dizinin boyutunu en aza indirir. Endeksi hesaplamak için formül:
Index = hashcode(Key) & (n-1)
Burada n dizinin boyutudur. Dolayısıyla 'Aman'ın endeks değeri şöyledir:
Index = 2657860 & (16-1) = 4
4 değeri, Anahtarın ve değerin HashMap'te depolanacağı hesaplanan dizin değeridir.
Java'ya eşittir
Hash Çarpışması
Hesaplanan endeks değerinin iki veya daha fazla Anahtar için aynı olması durumudur. Başka bir Anahtar 'Sunny'nin hash kodunu hesaplayalım. 'Sunny' için karma kodun 63281940 olduğunu varsayalım. Anahtarı hafızada saklamak için indeks formülünü kullanarak indeks hesaplamamız gerekir.
Index=63281940 & (16-1) = 4
4 değeri, Anahtarın HashMap'te saklanacağı hesaplanan dizin değeridir. Bu durumda equals() yöntemi her iki Anahtarın da eşit olup olmadığını kontrol eder. Anahtarlar aynıysa değeri geçerli değerle değiştirin. Aksi takdirde, bu düğüm nesnesini LinkedList aracılığıyla mevcut düğüm nesnesine bağlayın. Dolayısıyla her iki Anahtar da dizin 4'te saklanacaktır.
Benzer şekilde 'Ritesh' Anahtarını da saklayacağız. Anahtarın karma kodunun 2349873 olduğunu varsayalım. Dizin değeri 1 olacaktır. Dolayısıyla bu Anahtar, dizin 1'de saklanacaktır.
HashMap'te get() yöntemi
Get() yöntemi, değeri Anahtarına göre almak için kullanılır. Anahtarı bilmiyorsanız değeri getirmez. get(K Key) metodu çağrıldığında Key'in hash kodunu hesaplar.
Diyelim ki 'Aman' Anahtarını almamız gerekiyor. Aşağıdaki yöntem çağrılacaktır.
bir komut arp
map.get(new Key('Aman'));
Hash kodunu 2657860 olarak üretiyor. Şimdi indeks formülünü kullanarak 2657860 indeks değerini hesaplayın. Endeks değeri yukarıda hesapladığımız gibi 4 olacaktır. get() yöntemi 4 indeks değerini arar. İlk Key öğesini verilen Key ile karşılaştırır. Her iki anahtar da eşitse, düğümdeki bir sonraki öğenin mevcut olup olmadığını kontrol etmek için else değerini döndürür. Senaryomuzda düğümün ilk elemanı olarak bulunur ve 19 değerini döndürür.
Hadi başka bir Anahtar 'Güneşli' getirelim.
'Sunny' anahtarının hash kodu 63281940'tır. 63281940'ın hesaplanan indeks değeri put() yöntemi için hesapladığımız gibi 4'tür. Dizinin 4. dizinine gidin ve ilk öğenin Anahtarını verilen Anahtarla karşılaştırın. Ayrıca Anahtarları da karşılaştırır. Senaryomuzda verilen Anahtar ikinci öğedir ve düğümün bir sonraki öğesi boştur. İkinci öğe olan Key'i belirtilen Key ile karşılaştırır ve 29 değerini döndürür. Düğümün sonraki öğesi null ise null değerini döndürür.