Middle
Aké sú pravidlá pre metódy equals a hashCode?
sobes.tech AI
Odpoveď od AI
- Ak sú dva objekty rovnaké podľa metódy
equals(Object), ich hash kódy (vrátené metódouhashCode()) by mali byť rovnaké. - Ak dva objekty nie sú rovnaké podľa metódy
equals(Object), ich hash kódy môžu byť rovnaké alebo odlišné. Dobrou praxou je zabezpečiť odlišné hash kódy pre nerovné objekty pre lepší výkon kolekcií založených na hashovaní. - Metóda
hashCode()by mala vracať rovnaké hodnoty pre ten istý objekt pri viacerých volaniach, pokiaľ sa informácie používané na výpočet hash-u nezmenili. - Symetria: pre akékoľvek objekty
aab, aka.equals(b)jetrue, potomb.equals(a)tiež musí byťtrue. - Reflexivita: pre každý nenulový objekt
a,a.equals(a)musí byťtrue. - Transitivita: pre akékoľvek objekty
a,bac, aka.equals(b)jetrueab.equals(c)jetrue, potoma.equals(c)tiež musí byťtrue. - Konzistentnosť: pre akékoľvek nenulové objekty
aab, opakované volaniaa.equals(b)by mali konzistentne vracaťtruealebofalse, pokiaľ sa informácie používané vequals(Object)nezmenili.
Príklad implementácie:
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 objektov
if (this == o) {
return true;
}
// Kontrola typu objektu
if (o == null || getClass() != o.getClass()) {
return false;
}
// Kastovanie
MyClass myClass = (MyClass) o;
// Porovnanie podľa polí
return value == myClass.value &&
Objects.equals(name, myClass.name); // Použitie Objects.equals pre null
}
@Override
public int hashCode() {
// Použitie Objects.hash
return Objects.hash(value, name);
}
// Iné metódy...
}