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
xuny,x.equals(y)jāatgriežtruetikai tad, jay.equals(x)arī atgriežtrue. -
Transitivitāte: jebkurām nenulles norādītajām vērtībām
x,yunz, jax.equals(y)atgriežtrueuny.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
xuny, atkārtoti izsaucotx.equals(y), tas jādara pastāvīgitruevai pastāvīgifalse, ja vienequalssalī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, tadhashCodemetodes 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,hashCodemetodes 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
}
}