Sobes.tech
Middle

Java-da equals və hashCode metodlarının müqavilələri haqqında danış.

sobes.tech Süni İntellekt

AI-dan cavab

  • İzohorlik: hər hansı sıfır olmayan referans dəyəri üçün x, x.equals(x) true qaytarmalıdır.

  • Simmetriya: hər hansı sıfır olmayan referans dəyərlər xy üçün, x.equals(y) yalnız y.equals(x) true olarsa true qaytarmalıdır.

  • Transitivlik: hər hansı üç sıfır olmayan referans dəyəri x, yz üçün, əgər x.equals(y) truey.equals(z) truedirsə, x.equals(z)true olmalıdır.

  • Uyumluluq: hər hansı iki sıfır olmayan referans dəyəri xy üçün, x.equals(y) çoxsaylı çağırışlar ardıcıl olaraq true və ya false qaytarmalıdır, şərt odur ki, obyektlərin equals müqayisələrində istifadə olunan heç bir məlumat dəyişməz.

  • Hər hansı sıfır olmayan referans dəyəri üçün x, x.equals(null) false olmalıdır.

  • Əgər iki obyekt equals(Object) metoduna görə bərabərdirsə, onda hər iki obyekt üçün hashCode metodunun çağırışı eyni tam ədəd dəyərini verməlidir.

  • Əgər iki obyekt equals(java.lang.Object) metoduna görə bərabər deyilsə, onda hər iki obyekt üçün hashCode metodunun çağırışı müxtəlif tam ədəd dəyərlərini verməlidir. Lakin, proqramçı başa düşməlidir ki, bərabər olmayan obyektlər üçün fərqli hash kodlarının yaradılması hash cədvəllərinin performansını artıra bilər.

Hər iki metodu equalshashCode yenidən təyin etmək vacibdir, əgər biri yenidən təyin olunursa, müqaviləni qorumaq üçün. equals istifadə edərkən hashCode-u yenidən təyin etməmək, hash əsaslı kolleksiyaların (məsələn, HashMap, HashSet) düzgün işləməməsinə səbəb ola bilər.

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; // İzohorlik
        if (o == null || getClass() != o.getClass()) return false; // null və tip yoxlaması
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // Məzmun müqayisəsi
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // Sahələrə əsaslanan hash yaradılması
    }
}