JavaRush /Блоги Java /Random-TG /Усулҳои изофабори баробар () ва hashCode () дар Java
Coder
Сатҳи

Усулҳои изофабори баробар () ва hashCode () дар Java

Дар гурӯҳ нашр шудааст

Усулҳои баробар() ва hashCode() дар Java бекор карда мешаванд

Equalsва hashCodeусулҳои бунёдии дар синф эълоншуда Objectва дар китобхонаҳои стандартии Java мавҷудбуда мебошанд. Усулҳои изофабори баробар() ва hashCode() дар Java - 1Ин усул барои муқоисаи an objectҳо ва тавлиди рамзи бутуни an object еquals()истифода мешавад . hashCodeИн усулҳо дар китобхонаҳои стандартии Java ҳангоми ворид кардан ва дарёфт кардани an objectҳо ба HashMap. Ин усул equalинчунин барои таъмини он, ки танҳо an objectҳои беназир дар HashSetдигар Setамалияҳо нигоҳ дошта мешаванд, инчунин дар ҳама ҳолатҳои дигаре, ки an objectҳоро муқоиса кардан лозим аст, истифода мешавад. Татбиқи пешфарзии усул equals()дар синф java.lang.Objectистинодҳоро бо суроғаҳои хотирае, ки тағирёбандаҳо нигоҳ медоранд ва trueтанҳо дар сурати мувофиқат кардани суроғаҳо бармегардонад, ба ибораи дигар, тағирёбандаҳо ба як an object ишора мекунанд. Java тавсия медиҳад, ки усулҳо equals()ва усулҳоро бекор кунед hashCode(), агар шумо интизор бошед, ки муқоиса мувофиқи мантиқи табиӣ ё мантиқи тиҷорат анҷом дода шавад. Бисёр синфҳо дар китобхонаҳои стандартии Java онҳоро бекор мекунанд, масалан, синф Stringбаргардонида мешавад , ки агар мундариҷаи ду an objectи муқоисашаванда якхела бошанд, equalsон бармегардад . trueСинфи печанда Integerусули equalиҷрои муқоисаи рақамиро бекор мекунад ва ғайра. Азбаски Java HashMapинчунин барои муқоисаи онҳо ва усулҳо такя мекунад , Java қоидаҳои зеринро барои бекор кардани ин усулҳо пешниҳод мекунад: HashTableequals()hashCode()keyvalues
  1. Рефлексивӣ: Объект бояд ба худ баробар бошад.
  2. Симметрӣ: агар a.equals(b)он баргардад true, он гоҳ b.equals(a)бояд баргардад true.
  3. Гузариш: агар a.equals(b)он баргардад trueва b.equals(c)инчунин баргардад true, пас c.equals(a)он бояд баргардад true.
  4. Пайвастагӣ: Зангҳои такрорӣ ба усул equals()бояд ҳамон арзишро баргардонанд, то даме ки баъзе арзишҳои моликияти an object тағир наёбанд. Яъне, агар ду an object дар Java баробар бошанд, он гоҳ онҳо то даме ки хосиятҳои онҳо бетағйир мемонанд, баробар хоҳанд буд.
  5. Муқоиса null: Объект бояд барои тафтиш карда шавад null. Агар an object ба - баробар бошад null, пас усул бояд баргардад false, на NullPointerException. Масалан, a.equals(null)он бояд баргардад false.

Созишнома байни баробар ва hashCode дар Java

  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. Аксарияти IDE-ҳо ба монанди NetBeans, Eclipse ва IntelliJ IDEA барои тавлиди усулҳо equals()ва hashCode(). Дар Eclipse, тугмаи рости рост -> сарчашма -> generate equals()ва hashCode().

  2. Агар синф калиди ягонаи тиҷорӣ дошта бошад, пас танҳо барои санҷиши баробарии ин майдонҳо кофӣ хоҳад буд. Тавре ки дар мисоли мо, "id" рақами ягона барои ҳар як Шахс аст.

  3. Ҳангоми бекор кардани hashCode()Java, боварӣ ҳосил кунед, ки ҳамаи майдонҳоеро, ки дар метод истифода шудаанд, истифода баред equals().

  4. Stringва синфҳои печанда ба монанди Integer, Floatва Doubleметодро бекор мекунанд equals(), аммо StringBufferбекор намекунад.

  5. То ҳадди имкон, майдонҳоро immutableбо истифода аз finalтағирёбандаҳо дар Java созед.

  6. Ҳангоми муқоисаи Stringan objectҳо equals()ба ҷои оператори .-ро истифода баред ==.

  7. Ду an objectе, ки мантиқӣ баробаранд, вале аз an objectҳои гуногун бор карда шудаанд, ClassLoaderнаметавонанд баробар бошанд. Дар хотир доред, ки тафтиш бо он getClass()бармегардад false, агар синфи боркунак гуногун бошад.

  8. @OverrideЭзоҳро инчунин дар усули . истифода баред hashCode, зеро ин хатогиҳои нозукро, ба монанди арзиши баргардонидани , пешгирӣ мекунад.Бо intвуҷуди ин, баъзе барномасозон бармегарданд long.

PS Ҳамкорони мӯҳтарам! Ман ин мақоларо барои ҳалли мушкилоти сатҳи 21 муфид пайдо кардам! Дар тахлor ин мавзуъ ба шумо барори кор хохонам, аз тарчума истифода баред! Умедворам, ки шумо ба ман барои баланд бардоштани рейтинги ман кӯмак мекунед, зеро ҳоло ман дар ин форум ҳатто шарҳ дода наметавонам. Ташаккури зиёд, ҳама! Мақолаи аслӣ ман аз сабаби набудани вақти холӣ баъзе нуктаҳоро сарфи назар кардам, аммо ман ҳама чизеро, ки барои ҳалли мушкилоти сатҳи 21 лозим аст, тарҷума кардам.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION