Equals ve HashCode Metotlarının Önemi Nedir?

Metin Alnıaçık
3 min readSep 24, 2018

--

Öncelikle equals metodunu inceleyelim;

İlgili metot, iki nesnenin içeriğinin aynı olup olmadığını kontrol eder.

(==) operatörü adreslerin aynı olup olmadığını kontrol eder.

Örneğin
Person p1 = new Person(12345L, “Yusuf”, “Alnaıçık”);
Person p2 = new Person(12345L, “Yusuf”, “Alnıaçık”);

System.out.println(p1 == p2);

Sonuç false olarak dönecektir. Çünkü nesneler farklı adreslere sahiptirler.

Aynı şekil üzerinde equals metodunu da anlatalım.

Eğer equals metodu tanımlı değilse sonuç false olacaktır.

Person class’ına equals metodunu tanımlayalım;

Tüm alanların içeriklerinin aynı olup olmadığı kontrol eder. Bu durumda true sonucu dönecektir.

Gelelim collection’larda çok fazla önem taşıyan hashcode metoduna, Aşağıdaki code çalıştırıldığında üç kayıt görünecektir. Çünkü hashcode tanımlanmamıştır.

Person p1 = new Person(12345L, “Yusuf”, “Alnıaçık”);
Person p2 = new Person(12345L, “Yusuf”, “Alnıaçık”);
Person p3 = new Person(13579L, “Dilek”, “Alnıaçık”);

Map<Person, String> liste = new HashMap<>();
liste.put(p1, “Yusuf”);
liste.put(p2, “Yusuf”);
liste.put(p3, “Dilek”);

System.out.println(liste.size());

p1 ve p2 nin tüm değerleri aynı olmasına rağmen Person class’ında hashcode metodu olmadığından sonuç üç olacaktır.

Örneklerimize hashcode ve equals metotlarını tanımlayarak devam edelim;

Person p1 = new Person(12345L, “Yusuf”, “Alnıaçık”);
Person p2 = new Person(12121L, “Yusuf”, “Alnıaçık”);
Person p3 = new Person(13579L, “Dilek”, “Alnıaçık”);

Map<Person, String> liste = new HashMap<>();

liste.put(p1, “Yusuf”);
liste.put(p2, “Yusuf”);
liste.put(p3, “Dilek”);

System.out.println(liste.size());

HashCode metodu identityNumber’a bakıyor. Eğer identityNumber unique (eşsiz) ise bunu farklı bir kayıt sayarak listeye ekliyor. Sonuç olarak üç değeri döner.

Person p1 = new Person(12345L, “Yusuf”, “Alnıaçık”);
Person p2 = new Person(12345L, “Metin”, “Alnıaçık”);
Person p3 = new Person(12345L, “Dilek”, “Alnıaçık”);

Map<Person, String> liste = new HashMap<>();
liste.put(p1, “Yusuf”);
liste.put(p2, “Metin”);
liste.put(p3, “Dilek”);

System.out.println(liste.size());

Yukarıdaki örnekte ise biraz değişiklik yaptık ve kodun çalışma şeklinde biraz farklılıklar oluştu.

Öncelikle, p1 kaydı listeye ekleniyor. Daha sonra p2 kaydı ile p1 kaydının identityNumber değerleri aynı olduğundan dolayı kaydın tamamen aynı olup olmadığını anlamak için equals metoduna kullanılarak p1’in ve p2'nin tüm alanlarının içerikleri aynı olup olmadığı kontrol ediliyor ve aynı olmadığı tespit edilerek, bu kayıt listeye ekleniyor.

Son olarak p3'ün kontrolü yapılıyor. p3'ün identityNumber değeri p1 ve p2 ile aynı olduğundan p1 ve p3 için equals metodu çalışır ve tüm alanların içerikleri aynı olmadığından dolayı sonuc false döner. Daha sonra p2 ve p3 için equals metodu çalışır ve durum bu kayıtlar içinde aynıdır. Sonuç yine false döner. Yani bir kaydın identityNumber değeri kaç kayıt ile aynı olursa, ilgili kayıtların tümü ile equals metodu çalışacaktır.

Person p1 = new Person(12345L, “Yusuf”, “Alnıaçık”);
Person p2 = new Person(12345L, “Dilek”, “Alnıaçık”);
Person p3 = new Person(12345L, “Dilek”, “Alnıaçık”);

Map<Person, String> liste = new HashMap<>();
liste.put(p1, “Yusuf”);
liste.put(p2, “Dilek”);
liste.put(p3, “Dilek”);

System.out.println(liste.size());

Son olarak yukarıdaki örneği inceleyelim. İlk olarak p1 nesnesi listeye eklenecektir. p2 nesnesinin identityNumber değeri p1 ile aynı olduğundan equals metodu çalışacaktır. Tüm değerler kontrol edildiğinde farklılık görülmektedir. Bundan dolayı sonuç false dönecektir ve kayıt listeye eklenecektir. p3'ün identityNumber değeri p1 ile aynı olduğundan equals metoduna gidilir. Nesnelerin alanları karşılaştırıldığında, farklılıklar bulunduğundan dolayı değer false dönecektir. p2'nin ve p3'ün identityNumber değerleri aynı olduğundan equals metoduna gidilir. Tüm alanların değerleri aynı olduğundan, sonuç true dönecektir. Bu durumda, her iki kaydın aynı olduğu anlamına gelir. Bu durumda ise listeye kayıt ekleme işlemi gerçekleşmez. Toplam kayıt sayısı iki olarak görülmektedir.

Örneğin tamamına github adresimden ulaşabilirsiniz.

İyi günler,
Bol kodlamalar :)

--

--

No responses yet