Разкажи за договорите на методите 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); // Генериране на хеш на базата на полетата
}
}