გააზიარე Java-ში equals და hashCode მეთოდების კონტრაქტები.
sobes.tech AI
პასუხი AI-სგან
-
ინსპექტირებადობა: ნებისმიერი ნულოვანი მიმთითებელი მნიშვნელობის
xშემთხვევაში,x.equals(x)უნდა აბრუნებდესtrue. -
სიმეტრიულობა: ნებისმიერი ნულოვანი მიმთითებელი მნიშვნელობებისთვის
xდაy,x.equals(y)უნდა აბრუნებდესtrueთუ და მხოლოდ თუy.equals(x)აბრუნებსtrue. -
ტრანზიტივობა: ნებისმიერი ნულოვანი მიმთითებელი მნიშვნელობებისთვის
x,yდაz, თუx.equals(y)აბრუნებსtrueდაy.equals(z)აბრუნებსtrue, მაშინx.equals(z)უნდა აბრუნებდესtrue. -
კონსისტენტობა: ნებისმიერი ნულოვანი მიმთითებელი მნიშვნელობებისთვის
xდაy, მრავალჯერადი ზარებიx.equals(y)უნდა მუდმივად აბრუნებდესtrueან მუდმივადfalse, იმ პირობით, რომ არ შეიცვალა ინფორმაცია, რომელიც გამოიყენებაequalsშედარებებში ობიექტებზე. -
ნებისმიერი ნულოვანი მიმთითებელი მნიშვნელობისთვის
x,x.equals(null)უნდა აბრუნებდესfalse. -
თუ ორი ობიექტი თანხვედრაშია
equals(Object)მეთოდის მიხედვით, მაშინhashCodeმეთოდის გამოძახება ორივე ობიექტისთვის უნდა აძლევდეს ერთსა და იმავე მთელ რიცხვს. -
არ არის საჭირო, რომ თუ ორი ობიექტი არ არის თანხვედრაში
equals(java.lang.Object)მეთოდის მიხედვით,hashCodeმეთოდის გამოძახება ორივე ობიექტისთვის უნდა აძლევდეს განსხვავებულ მთელ რიცხვს. თუმცა, პროგრამისტმა უნდა გაიგოს, რომ განსხვავებული ჰეშ-კოდების გენერირება არათანაბარ ობიექტებზე შეიძლება გაზარდოს ჰეშ-ტაბლების მუშაობის ეფექტურობა.
მნიშვნელოვანია, ორივე მეთოდი equals და hashCode გადაფაროს, თუ ერთს გადაფარავს, რათა შეინარჩუნოს კონტრაქტი. equals-ის გამოყენება hashCode-ის გარეშე შეიძლება გამოიწვიოს კოლექციების არასწორი მუშაობა, რომლებიც იყენებენ ჰეშირებას (მაგალითად, HashMap, HashSet).
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; // რეფლექსივობა
if (o == null || getClass() != o.getClass()) return false; // null და კლასი
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // შინაარსის შედარება
}
@Override
public int hashCode() {
return Objects.hash(name, age); // ჰეშის გენერირება ფილდერებზე
}
}