JavaRush /Java Blog /Random-TK /Artykmaç ýüklemek Java-da () we hashCode () usullaryna de...
Coder
Dereje

Artykmaç ýüklemek Java-da () we hashCode () usullaryna deňdir

Toparda çap edildi

Java-da deň () we hashCode () usullaryny ýok etmek

Equalswe hashCodesynpda yglan edilen Objectwe adaty Java kitaphanalarynda bar bolan esasy usullardyr. Artykmaç ýüklemek Java - 1-de () we hashCode () usullaryna deňdirBu usul obýektleri deňeşdirmek we obýekt üçin bitewi kod döretmek üçin еquals()ulanylýar . hashCodeBu usullar, obýektleri salmak we almak üçin Java standart kitaphanalarynda giňden ulanylýar HashMap. Bu usul, beýleki amallarda bolşy ýaly, obýektleriň deňeşdirilmeli beýleki ýagdaýlarynda-da equaldiňe täsin obýektleriň saklanmagyny üpjün etmek üçin ulanylýar . Usulyň synpda ýerine ýetirilmegi üýtgeýjileriň saklaýan we diňe salgylar gabat gelýän ýagdaýynda gaýdyp gelýän ýat salgylaryna salgylanmalary deňeşdirýär, başgaça aýdylanda üýtgeýjiler şol bir obýekte degişlidir. Java, deňeşdirmäniň tebigy logika ýa-da iş logikasyna laýyklykda edilmegine garaşsaňyz, usullary we usullary ýok etmegi maslahat berýär. Adaty Java kitaphanalarynda köp synplar olary ýok edýär, mysal üçin deňeşdirilýän iki obýektiň mazmuny birmeňzeş bolsa, synp gaýdyp gelýär . Örtük synpy san deňeşdirmesini ýerine ýetirmek usulyny ýok edýär we ş.m. Java hem deňeşdirmek üçin usullara we usullara bil baglaýandygy sebäpli , Java bu usullary ýok etmek üçin aşakdaky düzgünleri hödürleýär: HashSetSetequals()java.lang.Objecttrueequals()hashCode()StringequalstrueIntegerequalHashMapHashTableequals()hashCode()keyvalues
  1. Reflekslilik: Obýektiň özi deň bolmaly.
  2. Simmetrik: a.equals(b)gaýdyp gelse true, b.equals(a)gaýdyp gelmeli true.
  3. Geçişlik: a.equals(b)gaýdyp gelse -de true, b.equals(c)gaýdyp gelse- truede, c.equals(a)gaýdyp gelmeli true.
  4. Dowamlylyk: Bir usula gaýtalanýan jaňlar, equals()obýektiň käbir emläk bahalary üýtgemese, şol bir bahany yzyna gaýtarmaly. Javaagny, Java-da iki obýekt deň bolsa, häsiýetleri üýtgemese, deň bolar.
  5. Deňeşdirme null: Obýekt barlanylmaly null. Obýekt deň bolsa null, usul falseyzyna gaýdyp gelmeli NullPointerException. Mysal üçin, a.equals(null)gaýdyp gelmeli false.

Java-da deň we hashCode arasynda ylalaşyk

  1. Usul ýerine ýetirilişiniň netijelerinde obýektler deň bolsa equals, şol hashcodebir bolmaly.
  2. Usul ýerine ýetirilişiniň netijelerinde obýektler deň bolmasa equals, hashcodeşol bir ýa-da başga bolup biler. Şeýle-de bolsa, öndürijiligi gowulandyrmak üçin dürli obýektleriň dürli kodlary yzyna gaýtarmagy has gowudyr.

Как переопределять метод 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 такие How NetBeans, Eclipse и IntelliJ IDEA обеспечивают поддержку генерации методов equals() и hashCode(). В Eclipse нажмите правую кнопку -> source -> generate equals() и hashCode().

  2. Если в классе есть уникальный бизнес-ключ, то будет достаточно сделать проверку только на equalsство этих полей. Как в нашем примере “id” - уникальный номер для каждого Person.

  3. При переопределении hashCode() в Java удостоверьтесь в использовании всех полей, что были использованы в методе equals().

  4. Stringýaly örtük synplary Integerwe usuly ýok etmek Float, ýöne ýok etmek däl.Doubleequals()StringBuffer

  5. Mümkin boldugyça Java-da üýtgeýjileri immutableulanyp meýdan düzüň.final

  6. StringObýektleri deňeşdireniňde , equals()ýerine operatory ulanyň ==.

  7. Logiki taýdan deň, ýöne dürli obýektlerden ýüklenen iki obýekt ClassLoaderdeň bolup bilmez. Loadadyňyzdan getClass()çykarmaň false, ýükleýji synp başga bolsa.

  8. @OverrideAnnotasiýany hem usulda ulanyň hashCode, sebäbi bu yzyna gaýtaryş gymmaty ýaly inçe ýalňyşlyklaryň öňüni alýar int. Someöne käbir programmistler gaýdyp gelýärler long.

PS Hormatly kärdeşlerim! Bu makalany 21-nji derejeli meseleleri çözmekde peýdaly hasapladym! Bu mowzugy seljermekde üstünlik arzuw edýärin, terjimesini ulanyň! Reýtingimi ýokarlandyrmaga kömek edersiňiz diýip umyt edýärin, sebäbi şu forumda teswir ýazyp bilemok. Hemmäňize köp sag boluň! Asyl makala Boş wagtyň ýoklugy sebäpli käbir nokatlary goýmadym, ýöne 21-nji derejeli meseleleri çözmek üçin bilmeli zatlaryňyzy terjime etdim.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION