Vertel over de contracten van de methods equals en hashCode in Java.
sobes.tech AI
Antwoord van AI
-
Reflectiviteit: voor elke niet-nul referentiewaarde
x, moetx.equals(x)trueretourneren. -
Symmetrie: voor elke niet-nul referentiewaarde
xeny, moetx.equals(y)trueretourneren als en alleen alsy.equals(x)trueretourneert. -
Transitiviteit: voor elke drie niet-nul referentiewaarden
x,yenz, alsx.equals(y)trueretourneert eny.equals(z)trueretourneert, dan moetx.equals(z)ooktrueretourneren. -
Consistentie: voor elke niet-nul referentiewaarde
xeny, moeten meerdere aanroepen vanx.equals(y)consequenttrueoffalseretourneren, op voorwaarde dat geen informatie die in deequals-vergelijkingen van de objecten wordt gebruikt, tussen de aanroepen wordt gewijzigd. -
Voor elke niet-nul referentiewaarde
x, moetx.equals(null)falseretourneren. -
Als twee objecten gelijk zijn volgens de methode
equals(Object), dan moet de aanroep van de methodehashCodevoor elk van de twee objecten hetzelfde gehele getal opleveren. -
Het is niet vereist dat, als twee objecten niet gelijk zijn volgens de methode
equals(java.lang.Object), de aanroep van de methodehashCodevoor elk van de twee objecten verschillende gehele getallen oplevert. Echter, de programmeur moet begrijpen dat het genereren van verschillende hash-codes voor niet-gelijke objecten de prestaties van hash-tabellen kan verbeteren.
Het is belangrijk om beide methoden equals en hashCode te overschrijven als er één wordt overschreven, om het contract te behouden. Het gebruik van equals zonder hashCode overschrijving kan leiden tot incorrect gedrag van hash-gebaseerde collecties (bijvoorbeeld 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; // Reflexiviteit
if (o == null || getClass() != o.getClass()) return false; // null en type check
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // Inhoud vergelijking
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Hash genereren op basis van velden
}
}