Sobes.tech
Junior — Middle

რატომ არის აუცილებელი hashCode და equals მეთოდების გადაწერა, როდესაც ერთნაირი ობიექტები ემატება HashSet-ს?

sobes.tech AI

პასუხი AI-სგან

Java-ში HashSet იყენებს ჰეშ-ცხრილს ელემენტების შესანახად. სწორად განსაზღვრისთვის, არიან თუ არა ორი ობიექტი ერთნაირი და დუბლიკატების თავიდან აცილებისთვის, HashSet-ზე დაყრდნობა აქვს მეთოდებს hashCode() და equals().

  • მეთოდი hashCode() ითვლის ობიექტის ჰეშ-კოდს, რომელიც განსაზღვრავს, რომელ "კასეტაში" (bucket) იქნება განთავსებული ის ჰეშ-ცხრილში.
  • მეთოდი equals() შედარებს ორ ობიექტს თანასწორობისთვის.

თუ არ გადაწერთ ამ მეთოდებს თქვენს კლასში, გამოიყენება Object კლასის რეალიზაცია, რომელიც შედარებს ობიექტებს მისამართით (ანუ, ორი სხვადასხვა ობიექტი, რომლებიც ერთნაირი მონაცემებით არიან, ითვლება განსხვავებულად).

ამიტომ, აუცილებელია გადაწეროთ hashCode() და equals() მეთოდები ისე, რომ გაითვალისწინოთ ობიექტის მნიშვნელოვანი ველები.

მაგალითი:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    MyClass myClass = (MyClass) o;
    return field1.equals(myClass.field1) && field2.equals(myClass.field2);
}

@Override
public int hashCode() {
    return Objects.hash(field1, field2);
}

ამ გარეშე, HashSet შეიძლება შეინახოს რამდენიმე ობიექტი ერთნაირი მონაცემებით, რაც არღვევს კოლექციის ლოგიკას.