Sobes.tech
Junior

Java-ში equals() მეთოდი რა აკეთებს?

sobes.tech AI

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

Java-да equals() მეთოდი გამოიყენება ორი ობიექტის თანასწორობის შესამოწმებლად. დეფოლტად, როდესაც ობიექტები მემკვიდრეობას იღებენ Object-დან და მისი გადაწერით არ არის, ის შედარებას ახდენს ობიექტების მითითებებს (==), ანუ ამოწმებს, არის თუ არა ცვლადები ერთსა და იმავე მეხსიერების უბანში.

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

equals()-ის გადაწერილობისას, უნდა დაიცვას შემდეგი წესები:

  • რეფლექსივობა: ნებისმიერი ნულოვანი არაა x ობიექტისთვის, x.equals(x) უნდა აბრუნებდეს true.
  • სიმეტრიულობა: ნებისმიერი x და y არაა ნულოვანი ობიექტებისთვის, თუ x.equals(y) აბრუნებს true, მაშინ y.equals(x) უნდა აბრუნებდეს true.
  • ტრანზიტივობა: ნებისმიერი x, y, და z არაა ნულოვანი ობიექტებისთვის, თუ x.equals(y) და y.equals(z) ორივე true არის, მაშინ x.equals(z) უნდა აბრუნებდეს true.
  • კონსისტენტურობა: ნებისმიერი x და y არაა ნულოვანი ობიექტებისთვის, მრავალჯერადი ზარები x.equals(y) უნდა აბრუნებდეს ერთსა და იმავე შედეგს, თუ ორივე ობიექტში გამოყენებული ინფორმაცია არ შეცვლილა.
  • null-ის მიმართ უუნარობა: ნებისმიერი x არაა ნულოვანი ობიექტისთვის, x.equals(null) უნდა აბრუნებდეს false.

საშუალოდ, equals()-ის გადაწერილობისას, საჭიროა ასევე გადაწეროთ hashCode() მეთოდი, რომელიც უნდა შეესაბამებოდეს კონტრაქტს: თუ ორი ობიექტი თანასწორია equals()-ის მიხედვით, მათი hashCode()-ები უნდა იყოს ერთნაირი. საპირისპირო არ არის აუცილებელი: თუ ჰეშკოდები ერთნაირია, ობიექტები შესაძლოა არ იყოს თანასწორი.

მაგალითი გადაწერილი:

public class MyObject {
    private int value;
    private String name;

    public MyObject(int value, String name) {
        this.value = value;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        // შედარება
        if (this == o) return true;
        // null-ის და კლასი-ის შემოწმება
        if (o == null || getClass() != o.getClass()) return false;
        // ტიპის გადაყვანა და ფილდერების შედარება
        MyObject myObject = (MyObject) o;
        return value == myObject.value &&
               Objects.equals(name, myObject.name);
    }

    @Override
    public int hashCode() {
        // ჰეშკოდის გენერირება ფილდერების საფუძველზე
        return Objects.hash(value, name);
    }

    // გეტერები, სეტერები და ა.შ.
}