Sobes.tech
Middle

გააზიარე 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); // ჰეშის გენერირება ფილდერებზე
    }
}