Sobes.tech
Middle

Խոսիր 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); // Հաշվարկում հեշ ըստ դաշտերի
    }
}