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