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)trueqaytarmalıdır. -
Simmetriya: hər hansı sıfır olmayan referans dəyərlər
xvəyüçün,x.equals(y)yalnızy.equals(x)trueolarsatrueqaytarmalıdır. -
Transitivlik: hər hansı üç sıfır olmayan referans dəyəri
x,yvəzüçün, əgərx.equals(y)truevəy.equals(z)truedirsə,x.equals(z)dətrueolmalıdır. -
Uyumluluq: hər hansı iki sıfır olmayan referans dəyəri
xvəyüçün,x.equals(y)çoxsaylı çağırışlar ardıcıl olaraqtruevə yafalseqaytarmalıdır, şərt odur ki, obyektlərinequalsmü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)falseolmalıdır. -
Əgər iki obyekt
equals(Object)metoduna görə bərabərdirsə, onda hər iki obyekt üçünhashCodemetodunun ç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 üçünhashCodemetodunun ç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 equals və hashCode 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ı
}
}