Middle
Қоидаҳои барои усулҳои equals ва hashCode чист?
sobes.tech AI
Ҷавоб аз AI
- Калі два аб'екты роўныя па метадзе
equals(Object), то іх хэш-коды (якія вяртае метадhashCode()) павінны быць аднолькавымі. - Калі два аб'екты не роўныя па метадзе
equals(Object), то іх хэш-коды можа быць як аднолькавымі, так і рознымі. Добрая практыка — забяспечыць розныя хэш-коды для нераўных аб'ектаў для лепшай прадукцыйнасці калекцый, заснаваных на хэшах. - Метад
hashCode()павінен вяртаць аднолькавыя значэнні для аднаго і таго ж аб'екта пры шматразовых выкліках, калі ніякая інфармацыя, якая выкарыстоўваецца для вылічэння хэш-кода, не змянілася. - Сімметрычнасць: для любых аб'ектаў
aіb, каліa.equals(b)раўнаtrue, тоb.equals(a)таксама павінна быцьtrue. - Рэфлексіўнасць: для любога ненулявога аб'екта
a,a.equals(a)павінна быцьtrue. - Транзітыўнасць: для любых аб'ектаў
a,bіc, каліa.equals(b)раўнаtrueіb.equals(c)раўнаtrue, тоa.equals(c)таксама павінна быцьtrue. - Супадзенне: для любых ненулявых аб'ектаў
aіb, шматразовыя выклікіa.equals(b)павінны паслядоўна вяртацьtrueабоfalse, пры ўмове, што інфармацыя, якая выкарыстоўваецца ў параўнанняхequals(Object), не змянілася.
Прыклад рэалізацыі:
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) {
// Праверка ідэнтычнасці аб'ектаў
if (this == o) {
return true;
}
// Праверка тыпу аб'екта
if (o == null || getClass() != o.getClass()) {
return false;
}
// Прыводзім да патрэбнага тыпу
MyClass myClass = (MyClass) o;
// Параўнанне па палях
return value == myClass.value &&
Objects.equals(name, myClass.name); // Выкарыстоўваем Objects.equals для апрацоўкі null
}
@Override
public int hashCode() {
// Выкарыстанне Objects.hash для генерацыі хэш-кода на аснове палёў
return Objects.hash(value, name);
}
// Іншыя метады...
}