Sobes.tech
Middle

Дар бораи шартҳои усулҳои equals ва hashCode дар Java гап зан.

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); // Генериране на хеш на базата на полетата
    }
}