JavaRush /Java Blogu /Random-AZ /Java-da equals() və hashCode() metodlarının həddən artıq ...
Coder
Səviyyə

Java-da equals() və hashCode() metodlarının həddən artıq yüklənməsi

Qrupda dərc edilmişdir

Java-da equals() və hashCode() metodlarını ləğv etmək

EqualshashCodesinifdə elan edilmiş Objectvə standart Java kitabxanalarında olan fundamental metodlardır. Java-da equals() və hashCode() metodlarının həddən artıq yüklənməsi - 1Metod obyektləri müqayisə etmək və obyekt üçün tam kod yaratmaq üçün еquals()istifadə olunur . hashCodeBu üsullar Java standart kitabxanalarında obyektlərin daxil edilməsi və götürülməsi zamanı geniş istifadə olunur HashMap. Metod həmçinin digər tətbiqlərdə, eləcə də obyektlərin müqayisə edilməli olduğu hər hansı digər hallarda equalyalnız unikal obyektlərin saxlanmasını təmin etmək üçün istifadə olunur . Sinifdə metodun standart tətbiqi dəyişənlərin saxladığı yaddaş ünvanlarına istinadları müqayisə edir və yalnız ünvanlar uyğunlaşdıqda qaytarır, başqa sözlə, dəyişənlər eyni obyektə istinad edir. Əgər müqayisənin təbii məntiqə və ya biznes məntiqinə uyğun aparılacağını gözləyirsinizsə, Java və metodlarını ləğv etməyi tövsiyə edir. Standart Java kitabxanalarındakı bir çox siniflər onları ləğv edir, məsələn, müqayisə olunan iki obyektin məzmunu eyni olduqda, sinif geri qaytarılması üçün onları ləğv edir . Sarmalayıcı sinfi ədədi müqayisəni yerinə yetirmək üçün metodu ləğv edir və s. Java həm də onların və -lərini müqayisə etmək üçün metodlara və metodlara etibar etdiyi üçün Java bu metodları ləğv etmək üçün aşağıdakı qaydaları təklif edir: HashSetSetequals()java.lang.Objecttrueequals()hashCode()StringequalstrueIntegerequalHashMapHashTableequals()hashCode()keyvalues
  1. Refleksivlik: Obyekt özünə bərabər olmalıdır.
  2. Simmetrik: qaytarırsa a.equals(b), trueo b.equals(a)da qayıtmalıdır true.
  3. Transitivlik: a.equals(b)qayıdırsa trueb.equals(c)həmçinin qayıdırsa true, c.equals(a)o da qayıtmalıdır true.
  4. Ardıcıllıq: Bir metoda təkrar edilən zənglər equals()obyektin bəzi xüsusiyyət dəyərlərinin dəyişdirilmədiyi müddətcə eyni dəyəri qaytarmalıdır. Yəni Java-da iki obyekt bərabərdirsə, o zaman xassələri dəyişməz qaldıqca onlar bərabər olacaqlar.
  5. Müqayisə null: Obyekt yoxlanılmalıdır null. Əgər obyekt bərabərdirsə , o zaman metod deyil, nullqayıtmalıdır . Məsələn, qayıtmalıdır .falseNullPointerExceptiona.equals(null)false

Java-da bərabər və hashCode arasında razılaşma

  1. Если an objectы равны по результатам выполнения метода equals, тогда их hashcode должны быть одинаковыми.
  2. Если an objectы не равны по результатам выполнения метода equals, тогда их hashcode могут быть How одинаковыми, так и разными. Однако для повышения производительности, лучше, чтобы разные an objectы возвращали разные codeы.

Как переопределять метод equals в Java

  1. @Override
    public boolean equals(Object obj) {
    /*1. Check*/if (obj == this) {
    /*and return */ return true;
             }
  2. Проверьте an object на null, а также проверьте, чтобы an objectы были одного типа. Не делайте проверку с помощью instanceof так How такая проверка будет возвращать true для подклассов и будет работать правильно только в случае если ваш класс объявлен How immutable. Вместо этого можно использовать getClass();

    if (obj == null || obj.getClass() != this.getClass()) {
                return false;
    }
  3. Объявите переменную типа, который вы сравниваете, и приведите obj к этому типу. Потом сравнивайте каждый атрибут типа начиная с численных атрибутов (если имеются) потому что численные атрибуты проверяются быстрей. Сравнивайте атрибуты с помощью операторов И и ИЛИ (так называемые short-circuit logical operators) для объединения проверок с другими атрибутами.

    Person guest = (Person) obj;
            return id == guest.id && (firstName == guest.firstName ||
                (firstName != null && firstName.equals(guest.getFirstName())))
                    && (lastName == guest.lastName || (lastName != null &&                      lastName .equals(guest.getLastName())));
    }
Полный пример переопределения метода equals в Java
/** * Person class with equals and hashcode implementation in Java * @author Javin Paul */
public class Person {
    private int id;
    private String firstName;
    private String lastName;

    public int getId() { return id; }
    public void setId(int id) { this.id = id;}

    public String getFirstName() { return firstName; }
    public void setFirstName(String firstName) { this.firstName = firstName; }
    public String getLastName() { return lastName; }
    public void setLastName(String lastName) { this.lastName = lastName; }
    @Override
    public boolean equals(Object obj) {
    if (obj == this) {
        return true;
    }
    if (obj == null || obj.getClass() != this.getClass()) {
        return false;
    }

    Person guest = (Person) obj;
    return id == guest.id
        && (firstName == guest.firstName
            || (firstName != null &&firstName.equals(guest.getFirstName())))        && (lastName == guest.lastName
            || (lastName != null && lastName .equals(guest.getLastName())
            ));
    }
    @Override
    public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());             result = prime * result + id; result = prime * result +
        ((lastName == null) ? 0 : lastName.hashCode()); return result;
    }
 }

Распространенные ошибки при переопределении equals в Java

  1. Вместо того, чтобы переопределять метод equals (Override) программист перегружает его (Overload)Синтаксис метода equals() в классе Object определен How public boolean equals(Object obj), но многие программисты ненароком перегружают метод: public boolean equals(Person obj) - instead of Object в качестве аргумента используют Name своего класса (напр. Person). Эту ошибку сложно обнаружить из-за static binding. Таким образом, если вы вызовете этот метод для an object своего класса, то метод не просто скомпorруется, а даже сделает это корректно. Однако, если вы положите ваш an object в коллекцию, например ArrayList и вызовете метод contains(), работа которого основана на методе equals(), то метод contains не сможет обнаружить ваш an object.

  2. При переопределении метода equals() не проверять на null переменные, что в конечном итоге заканчивается NullPointerException при вызове equals(). Ниже представлен корректный code.

    firstname == guest.firstname || (firstname != null &&
         firstname.equals(guest.firstname));
  3. Третья распространенная ошибка это не переопределять метод hashCode(), а только equals(). Вы обязаны переопределять оба метода equals() и hashCode() в Java. Метод hashCode используется в hash -коллекциях(например HashSet), и чем меньше будет коллизий (одинаковый code при разных an objectх) тем эффективнее эти коллекции будут работать с an objectми вашего класса.

  4. Последняя распространенная ошибка программистов в том, что при переопределении метода equals() не сохраняется соответствие между методами equals() и compareTo(), что является неформальным требованием для избежания хранения дубликатов в Set (SortedSet, TreeSet).

Подсказки How писать в Java метод equals

  1. NetBeans, Eclipse və IntelliJ IDEA kimi əksər IDE-lər metodların yaradılması equals()hashCode(). Eclipse-də sağ klikləyin -> mənbə -> generate equals()hashCode().

  2. Sinfin unikal biznes açarı varsa, o zaman yalnız bu sahələrin bərabərliyini yoxlamaq kifayətdir. Nümunəmizdə olduğu kimi, “id” hər bir şəxs üçün unikal nömrədir.

  3. Java-da ləğv edərkən hashCode(), metodda istifadə olunan bütün sahələrdən istifadə etdiyinizə əmin olun equals().

  4. Stringvə kimi sarğı sinifləri Integervə metodu ləğv edir Float, lakin ləğv etmir.Doubleequals()StringBuffer

  5. Mümkünsə, Java-da dəyişənlərdən immutableistifadə edərək sahələr yaradın final.

  6. StringObyektləri müqayisə edərkən equals()yerinə . operatorundan istifadə edin ==.

  7. Məntiqi cəhətdən bərabər olan, lakin fərqli obyektlərdən yüklənən iki obyekt ClassLoaderbərabər ola bilməz. Unutmayın ki , yükləyici sinfi fərqli olarsa, ilə yoxlama getClass()geri qayıdacaq .false

  8. @OverrideAnnotasiyadan .metodunda da istifadə edin hashCode, çünki bu , məsələn , geri qaytarma dəyəri kimi incə xətaların qarşısını alır.Lakin intbəzi proqramçılar geri qayıdırlar long.

PS Hörmətli həmkarlar! Bu məqaləni 21-ci səviyyəli problemlərin həllində faydalı hesab etdim! Bu mövzunu təhlil etməkdə sizə uğurlar arzulayıram, tərcümədən istifadə edin! Ümid edirəm ki, reytinqimi yüksəltməkdə mənə kömək edəcəksiniz, çünki indi bu forumda heç bir şərh belə yaza bilmirəm. Çox sağ olun, hər kəs! Orijinal məqalə Boş vaxtım olmadığı üçün bəzi məqamları buraxdım, lakin 21-ci səviyyə problemlərini həll etmək üçün bilməli olduğunuz hər şeyi tərcümə etdim.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION