logo

HashMap'in Java'da Çalışması


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 Java'da Çalışması

HashMap'in iç işleyişini anlamadan önce hashCode() ve equals() yöntemleri hakkında bilgi sahibi olmalısınız.

'mason' formülü'
    eşittir():İki nesnenin eşitliğini kontrol eder. Anahtarın eşit olup olmadığını karşılaştırır. Object sınıfının bir metodudur. Geçersiz kılınabilir. equals() yöntemini geçersiz kılarsanız, hashCode() yöntemini geçersiz kılmak zorunludur.hash kodu():Bu, nesne sınıfının yöntemidir. Nesnenin bellek referansını tam sayı biçiminde döndürür. Yöntemden alınan değer, kova numarası olarak kullanılır. Kova numarası, haritanın içindeki öğenin adresidir. Boş Anahtarın karma kodu 0'dır.Kovalar:Düğümün dizisine kovalar denir. Her düğümün LinkedList gibi bir veri yapısı vardır. Birden fazla düğüm aynı paketi paylaşabilir. Kapasite olarak farklı olabilir.
HashMap'in Java'da Çalışması

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
HashMap'in Java'da Çalışması

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.

HashMap'in Java'da Çalışması

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'in Java'da Çalışması

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.