Sobes.tech
Middle

Pastāsti par equals un hashCode metožu līgumiem Java valodā.

sobes.tech AI

Atbilde no AI

  • Refleksivitāte: jebkurai nenulles norādītajai vērtībai x, x.equals(x) jāatgriež true.

  • Simbētija: jebkurām nenulles norādītajām vērtībām x un y, x.equals(y) jāatgriež true tikai tad, ja y.equals(x) arī atgriež true.

  • Transitivitāte: jebkurām nenulles norādītajām vērtībām x, y un z, ja x.equals(y) atgriež true un y.equals(z) atgriež true, tad arī x.equals(z) jāatgriež true.

  • Saskaņotība: jebkurām nenulles norādītajām vērtībām x un y, atkārtoti izsaucot x.equals(y), tas jādara pastāvīgi true vai pastāvīgi false, ja vien equals salīdzinājumā izmantotā informācija netiek mainīta starp izsaukumiem.

  • Jebkurai nenulles norādītajai vērtībai x, x.equals(null) jāatgriež false.

  • Ja divi objekti ir vienādi saskaņā ar equals(Object) metodi, tad hashCode metodes izsaukums abiem objektiem jānodrošina vienāds vesela skaitļa vērtība.

  • Nav prasības, lai ja divi objekti nav vienādi saskaņā ar equals(java.lang.Object) metodi, hashCode metodes izsaukums abiem objektiem nodrošinātu dažādas vesela skaitļa vērtības. Tomēr programmētājam jāapzinās, ka dažādu hash kodu ģenerēšana ne vienmēr ir nepieciešama, un tā var uzlabot hash tabulu veiktspēju.

Svarīgi ir pārdefinēt abus equals un hashCode metodes, ja viena no tām tiek pārdefinēta, lai saglabātu kontraktu. equals metodes izmantošana bez hashCode pārdefināšanas var novest pie kolekciju, kas izmanto hash funkcijas, nepareizas darbības (piemēram, 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; // Refleksivitāte
        if (o == null || getClass() != o.getClass()) return false; // Null un klases pārbaude
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // Salīdzināšana pēc satura
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // Hash ģenerēšana pēc lauciņiem
    }
}