equals()
equals(), bir nesnenin içeriğinin aynı olup olmadığını karşılaştırır. Genellikle eşitlik karşılaştırması olarak adlandırılır ve equals() yeniden tanımlanmazsa, içeride == ile aynı olduğu için özdeşlik karşılaştırması yapılır. Bu nedenle, nesneleri doğru bir şekilde eşitlik açısından karşılaştırmak istiyorsanız, mutlaka equals() kullanmalısınız.
hashCode()
hashCode(), iki nesnenin aynı nesne olup olmadığını kontrol eder. == ile aynı özdeşlik karşılaştırma işlevine sahiptir, ancak hashCode() yöntemi, çalışma zamanında nesnenin benzersiz bir tam sayı değerini döndürür. Genellikle Heap'te depolanan nesnenin bellek adresini döndürür.
Bu yöntem, native anahtar sözcüğü ile işaretlenmiştir ve bu, Java dışındaki dillerde geliştirilen dillerin Java'da kullanılması durumunda kullanılan bir anahtar sözcüktür.
Hash Nedir?
Hashing, değişken boyutlu bir giriş değerinden sabit boyutlu bir çıktı değeri oluşturmak için bir hash fonksiyonu kullanma sürecini ifade eder. Hashing yoluyla elde edilen değere hash kodu denir.
equals() ve hashCode()
Aynı nesnenin aynı bellek adresine sahip olması gerektiğinden, aynı nesnenin aynı hash koduna sahip olması gerektiği açıktır. Bu nedenle, equals() yerine hashCode()'ı da yeniden tanımlayarak aynı hash kodunu garanti eden bir kod yazmak daha iyidir.
Hash Veri Yapısı
Yukarıdaki gibi, HashSet veri yapısına eşit iki nesne ekleyelim. Bu Set'in boyutunu yazdırırsak, 2 olacaktır. Neden?
Hash'i kullanan veri yapısı, Key'i belirlerken hashCode()'ı kullandığı içindir. Yani, nesnelerin aynı olup olmadığını kontrol etmeden önce, iki nesnenin hash kodlarının aynı olup olmadığını kontrol eder ve ardından iki nesnenin eşit olup olmadığına karar verir. Bu durumda, hashCode() yeniden tanımlanmamışsa, Object'in hashCode()'ı kullanılır, bu nedenle her nesnenin depolandığı bellek adresi döndürülür. Bu nedenle, hash veri yapılarını kullanırken, equals()'a ek olarak hashCode()'ı da yeniden tanımlamak iyidir.
Kaynaklar
Beklenen Mülakat Soruları ve Cevapları
equals() ve hashCode() neden birlikte kullanılır?
Hash'i kullanan veri yapısı, Key'i belirlerken hashCode()'ı kullandığı içindir. Yani, nesnelerin aynı olup olmadığını kontrol etmeden önce, iki nesnenin hash kodlarının aynı olup olmadığını kontrol eder ve ardından iki nesnenin eşit olup olmadığına karar verir. Bu durumda, hashCode() yeniden tanımlanmamışsa, Object'in hashCode()'ı kullanılır, bu nedenle her nesnenin depolandığı bellek adresi döndürülür. Bu nedenle, hash veri yapılarını kullanırken, equals()'a ek olarak hashCode()'ı da yeniden tanımlamak iyidir.
Yorumlar0