Sobes.tech
Junior

Ինչու է օգտագործվում hashCode մեթոդը։

sobes.tech AI

Պատասխան AI-ից

Java և Kotlin- ում hashCode() մեթոդը օգտագործվում է օբյեկտին ներկայացնող ամբողջական թիվ ստանալու համար: Այն կարևոր դեր է խաղում հեշ-տախտակների վրա հիմնված հավաքածուներում (HashMap, HashSet, Hashtable), որտեղ այն օգտագործվում է արագ որոշելու համար, թե որ "խցիկում" (bucket) պետք է գտնվի կամ որոնվի օբյեկտը: Մுக்கிய կետեր՝

  • equals և hashCode պայմանագրի ապահովում: Եթե երկու օբյեկտներ համարվում են "հավասար" equals() մեթոդով, ապա նրանց hashCode() պետք է վերադարձնի նույն արժեքը: Հակառակը սխալ է՝ տարբեր օբյեկտներ կարող են ունենալ նույն հեշ-կոդը (կոլիզիա):
  • Արագ որոնում/ներմուծում: Հեշ-կոդը օգտագործվում է որպես ինդեքս արագ մուտք գործելու համար հեշ-հավաքածուներում: Բացակայության դեպքում մեծ հավաքածուներում որոնումը շատ ավելի դանդաղ կլիներ:
  • Անպայմանականություն: Եթե օբյեկտը չի նախատեսվում օգտագործել որպես բանալի հեշ-հավաքածուներում, ապա hashCode()-ի նախնական իրագործումը (հաճախ հիմնված հիշողության հասցեի վրա) կարող է բավարար լինել: Բայց եթե վերագրում եք equals(), ապա անհրաժեշտ է վերագրել նաև hashCode()՝ պայմանագրի պահպանման համար:
  • Տևականություն: hashCode() արժեքը անփոփոխ օբյեկտի համար պետք է մնա անփոփոխ ողջ կյանքի ընթացքում: Փոփոխական օբյեկտների համար հեշ-կոդը կարող է փոխվել, բայց դա պահանջում է զգուշություն:

Նմուշային բազային իրագործում Kotlin-ով:

data class User(val id: Long, val name: String)
// Դատարկ տվյալների դասերի `hashCode()` և `equals()` ավտոմատորեն գեներացվում են

Նմուշային ձեռքով իրագործում Java-ով (կարևոր է ճիշտ համակցել արժեքները):

class User {
    private final long id;
    private final String name;

    public User(long id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id == user.id &&
               Objects.equals(name, user.name); // Օգտագործում ենք Objects.equals՝ NullPointerException-ից խուսափելու համար
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name); // Օգտագործում ենք Objects.hash՝ հեշ-կոդների համակցման համար
    }
}