Middle
Ինչու՞ են վերաշարադրվում hashCode մեթոդը և համեմատության օպերատոր ==։
sobes.tech AI
Պատասխան AI-ից
hashCode և == օպերատորի վերագրումը (օբյեկտների համեմատությունը արժեքով, ոչ թե հղումով) անհրաժեշտ է HashSet և HashMap նման հեշային հավաքածուների ճիշտ աշխատանքի համար:
==օպերատոր՝ սահմանում է, երբ երկու օբյեկտներ համարվում են հավասար: Դրա նախնական տարբերակում, այն համեմատում է օբյեկտների հղումները: Վերագրելով, մենք իրականացնում ենք համեմատության տրամաբանությունը ըստ պարունակության կամ օբյեկտի հատկությունների:hashCodeմեթոդ՝ վերադարձնում է ամբողջ թիվ (հեշ կոդ) օբյեկտի համար: Եթե երկու օբյեկտներ հավասար են ըստ==, ապա նրանցhashCode-ները պետք է լինեն նույնը: հակառակ դեպքում, երկու օբյեկտ կարող է ունենալ նույնhashCode, բայց չլինել հավասար:
Այս պայմանագրի խախտումը (հավասար օբյեկտներ տարբեր hashCode-ներով) հանգեցնում է հեշային հավաքածուների սխալ աշխատանքի: Էլեմենտները կարող են ավելացվել մի քանի անգամ, որտեղ սպասվում է յուրահատուկություն (HashSet), կամ չի կարող գտնվել (HashMap):
Օրինակ՝
class Person {
final String name;
final int age;
Person(this.name, this.age);
@override
bool operator ==(Object other) {
// Ստուգում, որ other-ը Person է
if (identical(this, other)) return true;
if (other.runtimeType != runtimeType) return false;
// Համեմատում հատկությունները
return other is Person && name == other.name && age == other.age;
}
@override
int get hashCode => Object.hash(name, age); // Հաշվարկում է հեշ ըստ հատկությունների
}
void main() {
final p1 = Person('Alice', 30);
final p2 = Person('Alice', 30);
final p3 = Person('Bob', 25);
print(p1 == p2); // true (արժեքային համեմատություն, վերագրումից հետո)
print(p1 == p3); // false
final peopleSet = {p1};
print(peopleSet.contains(p2)); // true (հաշվարկ և համեմատություն)
}