JavaRush /Blog Jawa /Random-JV /Overloading padha () lan hashCode () cara ing Jawa
Coder
tingkat

Overloading padha () lan hashCode () cara ing Jawa

Diterbitake ing grup

Overriding padha () lan hashCode () cara ing Jawa

Equalslan hashCodeminangka metode dhasar sing diumumake ing kelas Objectlan ana ing perpustakaan Jawa standar. Overloading padha karo () lan hashCode () metode ing Jawa - 1Cara iki еquals()digunakake kanggo mbandhingake obyek lan hashCodengasilake kode integer kanggo obyek kasebut. Cara iki akeh digunakake ing perpustakaan standar Jawa nalika nglebokake lan njupuk obyek ing HashMap. Cara kasebut equaluga digunakake kanggo mesthekake yen mung obyek unik sing disimpen ing implementasi HashSetliyane Set, uga ing kasus liyane ing ngendi obyek kudu dibandhingake. Implementasi standar saka cara equals()ing kelas java.lang.Objectmbandhingaké referensi kanggo alamat memori sing variabel nyimpen lan bali truemung yen alamat cocog, ing tembung liyane, variabel nuduhake obyek padha. Jawa nyaranake overriding equals()lan cara hashCode()yen mbandhingaké wis samesthine kanggo tindakake logika alam utawa bisnis logika. Akeh kelas ing pustaka Jawa standar sing nimpa, contone, kelas Stringoverride equalssupaya bali trueyen isi rong obyek sing dibandhingake padha. Kelas pambungkus ngatasi Integercara equalkanggo nindakake perbandingan numerik, lan liya-liyane. Wiwit Jawa HashMapuga gumantung ing lan cara kanggo mbandhingaké lan , Jawa nawakake aturan ing ngisor iki kanggo overriding cara iki: HashTableequals()hashCode()keyvalues
  1. Refleksivity: Obyek kudu padha karo awake dhewe.
  2. Symmetrical: yen a.equals(b)bali true, banjur b.equals(a)uga kudu bali true.
  3. Transitivity: yen a.equals(b)bali truelan b.equals(c)uga bali true, banjur c.equals(a)uga kudu bali true.
  4. Konsistensi: Telpon bola-bali menyang cara equals()kudu ngasilake nilai sing padha anggere sawetara nilai properti obyek ora diganti. Tegese, yen rong obyek padha ing Jawa, mesthine bakal padha yen sifate ora owah.
  5. Perbandingan null: Objek kudu dipriksa null. Yen obyek padha karo null, banjur cara kudu bali false, ora NullPointerException. Contone, a.equals(null)kudu bali false.

Agreement antarane witjaksono lan hashCode ing Jawa

  1. Yen obyek padha karo asil eksekusi metode equals, mula hashcodekudu padha.
  2. Yen obyek ora padha karo asil eksekusi metode equals, mula hashcodebisa uga padha utawa beda. Nanging, kanggo nambah kinerja, iku luwih apik kanggo duwe obyek beda bali kode beda.

Как переопределять метод 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. Stringlan kelas pambungkus kayata Integer, Floatlan Doubleoverride cara equals(), nanging StringBufferora override.

  5. Yen bisa, gawe kolom immutablenggunakake finalvariabel ing Jawa.

  6. Nalika mbandhingake Stringobyek, gunakake equals()operator ==.

  7. Loro obyek sing logis padha nanging dimuat saka obyek beda ClassLoaderora bisa padha. Elinga yen mriksa karo getClass()bakal bali falseyen kelas loader beda.

  8. Gunakake @Overrideanotasi uga ing cara . hashCode, amarga iki nyegah kasalahan subtle kayata nilai bali saka int. Nanging, sawetara programer bali long.

PS Dear rekan kerja! Aku nemokake artikel iki migunani kanggo ngrampungake masalah level 21! Muga-muga sampeyan sukses ing nganalisa topik iki, gunakake terjemahan! Muga-muga sampeyan bisa nulungi aku ngunggahake rating, amarga saiki aku ora bisa menehi komentar ing forum iki. Thanks a lot, kabeh! Artikel asli aku ngilangi sawetara poin amarga ora duwe wektu luang, nanging aku nerjemahake kabeh sing sampeyan kudu ngerti kanggo ngatasi masalah level 21.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION