Sobes.tech
Junior

hashCode metodidan nima uchun foydalaniladi?

sobes.tech AI

AIdan javob

Java va Kotlin'da hashCode() metodi ob'ektni ifodalaydigan butun son qiymatini ishlab chiqarish uchun ishlatiladi. U hash jadval asosidagi kolleksiyalar (HashMap, HashSet, Hashtable) bilan ishlashda muhim rol o'ynaydi, bu yerda u ob'ekt joylashgan yoki qidiriladigan "konteyner" (bucket) ni tez aniqlash uchun ishlatiladi. Asosiy nuqtalar:

  • equals va hashCode shartlarini ta'minlash: Agar ikki ob'ekt equals() metodi bilan "teng" deb hisoblanadigan bo'lsa, ularning hashCode() ham bir xil qiymatni qaytarishi kerak. Aks holda, turli ob'ektlar bir xil hash kodiga ega bo'lishi mumkin (kolliziya).
  • Tez qidirish/qo'shish: Hash kod indeks sifatida ishlatiladi, bu hash kolleksiyalarida elementlarga tez kirishni ta'minlaydi. Buning bo'lmaganda, katta kolleksiyalarda qidiruv ancha sekin bo'lardi.
  • Majburiy emas: Agar ob'ekt hash kolleksiyalarida kalit sifatida ishlatilmayotgan bo'lsa, standart hashCode() (odatda xotira manziliga asoslangan) etarli bo'lishi mumkin. Ammo, equals() ni qayta yozilsa, hashCode() ni ham qayta yozish shart.
  • Barqarorlik: Nzm ob'ekt uchun hashCode() qiymati uning hayoti davomida o'zgarmasligi kerak. O'zgaruvchan ob'ektlar uchun hash kod o'zgarishi mumkin, lekin bu ehtiyotkorlik bilan ishlashni talab qiladi.

Kotlin'da asosiy misol:

data class User(val id: Long, val name: String)
// Data class uchun hashCode() va equals() avtomatik ravishda yaratiladi

Java'da qo'lda yozilgan misol (qiymatlarni to'g'ri birlashtirish muhim):

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); // NullPointerException ni oldini olish uchun Objects.equals ishlatiladi
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name); // Hash kodlarni birlashtirish uchun Objects.hash ishlatiladi
    }
}