Sobes.tech
Middle

Java'da equals ve hashCode metodlarının sözleşmeleri hakkında bilgi ver.

sobes.tech yapay zeka

AI'dan gelen yanıt

  • Yansıma: herhangi bir sıfır olmayan referans değeri x için, x.equals(x) true döndürmelidir.

  • Simetri: herhangi iki sıfır olmayan referans değeri x ve y için, x.equals(y) yalnızca y.equals(x) true ise true döndürmelidir.

  • Transitiflik: herhangi üç sıfır olmayan referans değeri x, y ve z için, eğer x.equals(y) true ve y.equals(z) true ise, x.equals(z) de true olmalıdır.

  • Tutarlılık: herhangi iki sıfır olmayan referans değeri x ve y için, x.equals(y) çoklu çağrıları sürekli olarak true veya false döndürmelidir, bu çağrılar arasında equals karşılaştırmalarında kullanılan bilgiler değişmediği sürece.

  • Herhangi bir sıfır olmayan referans değeri x için, x.equals(null) false döndürmelidir.

  • Eğer iki nesne equals(Object) yöntemiyle eşitse, her iki nesne için hashCode yöntemi çağrısı aynı tam sayı değerini vermelidir.

  • İki nesne equals(java.lang.Object) yöntemiyle eşit değilse, hashCode yöntemi çağrısı ile her iki nesne için farklı tam sayı değerleri vermesi gerekmez. Ancak, programcı farklı olmayan nesneler için farklı hash kodları üretmenin hash tablolarının performansını artırabileceğini anlamalıdır.

Her iki yöntemi de equals ve hashCode yeniden tanımlamak önemlidir, eğer biri yeniden tanımlanmışsa, sözleşmeyi korumak için. equals kullanımı hashCode yeniden tanımlanmadan, hash kullanılarak yapılan koleksiyonların (örneğin, HashMap, HashSet) düzgün çalışmamasına neden olabilir.

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true; // Yansıma
        if (o == null || getClass() != o.getClass()) return false; // null ve tip kontrolü
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // İçerik karşılaştırması
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // Alanlara göre hash üretimi
    }
}