Middle
Jaká jsou pravidla pro metody equals a hashCode?
sobes.tech AI
Odpověď od AI
- Pokud jsou dva objekty shodné podle metody
equals(Object), jejich hash kódy (vrácené metodouhashCode()) by měly být stejné. - Pokud dva objekty nejsou shodné podle metody
equals(Object), jejich hash kódy mohou být stejné nebo odlišné. Dobrou praxí je zajistit odlišné hash kódy pro nerovné objekty pro lepší výkon kolekcí založených na hashování. - Metoda
hashCode()by měla vracet stejné hodnoty pro tentýž objekt při více voláních, pokud se žádná informace používaná pro výpočet hash nezměnila. - Symetrie: pro jakékoli objekty
aab, pokuda.equals(b)jetrue, pakb.equals(a)by mělo být takétrue. - Reflexivita: pro jakýkoli nenulový objekt
a,a.equals(a)by mělo býttrue. - Transitivita: pro jakékoli objekty
a,bac, pokuda.equals(b)jetrueab.equals(c)jetrue, paka.equals(c)by mělo být takétrue. - Konzistence: pro jakékoli nenulové objekty
aab, opakované volánía.equals(b)by mělo konzistentně vracettruenebofalse, pokud se informace používané vequals(Object)nezměnily.
Příklad implementace:
public class MyClass {
private int value;
private String name;
public MyClass(int value, String name) {
this.value = value;
this.name = name;
}
@Override
public boolean equals(Object o) {
// Kontrola identity objektů
if (this == o) {
return true;
}
// Kontrola typu objektu
if (o == null || getClass() != o.getClass()) {
return false;
}
// Přetypování
MyClass myClass = (MyClass) o;
// Porovnání podle polí
return value == myClass.value &&
Objects.equals(name, myClass.name); // Použití Objects.equals pro null
}
@Override
public int hashCode() {
// Použití Objects.hash
return Objects.hash(value, name);
}
// Další metody...
}