Խոսիր Java-ում equals և hashCode մեթոդների պայմանների մասին։
sobes.tech AI
Պատասխան AI-ից
-
Ավետարարություն: ցանկացած ոչ զրոյական հղումային արժեք
xհամարx.equals(x)պետք է վերադարձնիtrue: -
Սիմետրիկություն: ցանկացած ոչ զրոյական հղումային արժեքների
xևy,x.equals(y)պետք է վերադարձնիtrueմիայն այն դեպքում, երբy.equals(x)վերադարձնիtrue: -
Տրանզիտիվություն: ցանկացած ոչ զրոյական հղումային արժեքների
x,yևz, եթեx.equals(y)վերադարձնիtrueևy.equals(z)վերադարձնիtrue, ապաx.equals(z)պետք է վերադարձնիtrue: -
Կոնսիստենտություն: ցանկացած ոչ զրոյական հղումային արժեքների
xևy, բազմակի կանչըx.equals(y)պետք է մշտապես վերադարձնիtrueկամ մշտապեսfalse, պայմանով, որ ոչ մի տեղեկատվություն, որը օգտագործվում էequalsհամեմատություններում, չի փոխվում միջեւ կանչերի: -
Որոշ
xոչ զրոյական հղումային արժեքի համար,x.equals(null)պետք է վերադարձնիfalse: -
Եթե երկու օբյեկտներ հավասար են
equals(Object)մեթոդի համաձայն, ապաhashCodeմեթոդի կանչը երկու օբյեկտների համար պետք է տա նույն ամբողջական արժեքը: -
Չպետք է պահանջվի, որ եթե երկու օբյեկտներ չեն հավասար
equals(java.lang.Object)մեթոդի համաձայն, ապաhashCodeկանչը երկու օբյեկտների համար պետք է տա տարբեր ամբողջական արժեքներ: Սակայն ծրագրավորողը պետք է հասկանի, որ տարբերhashCodeարժեքների գեներացիան անհավասար օբյեկտների համար կարող է բարելավել հեշային աղյուսակների կատարողականությունը:
Կարևոր է, որ երկու մեթոդները equals և hashCode-ը վերագրեն, եթե մեկը վերագրում է, որպեսզի պահպանվի պայմանագիրը: equals-ի օգտագործումը առանց hashCode վերագրելու կարող է հանգեցնել սխալ աշխատանքի հեշային հավաքածուներում (օրինակ, 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; // Ռեֆլեկտիվություն
if (o == null || getClass() != o.getClass()) return false; // Նշում null և տիպ
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // Համեմատում ըստ պարունակության
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Հաշվարկում հեշ ըստ դաշտերի
}
}