JavaRush /جاوا بلاگ /Random-SD /Overloading equals() ۽ hashCode() جاوا ۾ طريقا
Coder
سطح

Overloading equals() ۽ hashCode() جاوا ۾ طريقا

گروپ ۾ شايع ٿيل

جاوا ۾ برابر () ۽ hashCode () طريقن کي ختم ڪرڻ

Equals۽ hashCodeاهي بنيادي طريقا آهن جيڪي ڪلاس ۾ بيان ڪيا ويا آهن Object۽ معياري جاوا لائبريرين ۾ شامل آهن. Overloading equals() ۽ hashCode() جاوا ۾ طريقا - 1اهو طريقو еquals()استعمال ڪيو ويندو آهي شين جي مقابلي لاءِ ۽ hashCodeاعتراض لاءِ انٽيجر ڪوڊ ٺاهڻ لاءِ. اهي طريقا جاوا معياري لائبريرين ۾ وڏي پيماني تي استعمال ڪيا ويا آهن جڏهن شيون داخل ڪرڻ ۽ حاصل ڪرڻ ۾ HashMap. اهو طريقو equalپڻ استعمال ڪيو ويندو آهي انهي ڳالهه کي يقيني بڻائڻ لاءِ ته صرف منفرد شيون محفوظ ٿيل آهن HashSetٻين Setعملن ۾، ۽ انهي سان گڏ ڪنهن ٻئي صورت ۾ جتي شين جي مقابلي ڪرڻ جي ضرورت آهي. equals()ڪلاس ۾ طريقي جو ڊفالٽ عمل درآمد java.lang.Objectميموري ايڊريس جي حوالن جي ڀيٽ ڪري ٿو جيڪي متغير ذخيرو ڪن ٿا ۽ trueصرف ان صورت ۾ واپس اچن ٿا جڏهن ايڊريس ملن ٿا، ٻين لفظن ۾، متغير ساڳئي اعتراض ڏانهن اشارو ڪن ٿا. جاوا سفارش ڪري ٿو equals()۽ طريقن کي ختم ڪرڻ جي hashCode()جيڪڏھن توھان توقع ڪريو ته مقابلي کي قدرتي منطق يا ڪاروباري منطق جي مطابق ڪيو وڃي. معياري جاوا لائبريرين ۾ ڪيترائي ڪلاس انھن کي اوور رائيڊ ڪندا آھن، مثال طور ڪلاس Stringاووررائڊ ڪري ٿو equalsته جيئن trueٻن شين جي مواد جو مقابلو ڪيو وڃي ته اھو واپس اچي. ريپر ڪلاس عددي مقابلي کي انجام ڏيڻ جي Integerطريقي کي ختم ڪري ٿو equal، وغيره. جيئن ته جاوا HashMapپڻ انحصار ڪري ٿو ۽ طريقن سان مقابلو ڪرڻ لاءِ انهن جي ۽ ، جاوا پيش ڪري ٿو هيٺيون ضابطا انهن طريقن کي ختم ڪرڻ لاءِ: HashTableequals()hashCode()keyvalues
  1. Reflexivity: اعتراض پاڻ جي برابر هجڻ گهرجي.
  2. Symmetrical: جيڪڏهن a.equals(b)اهو موٽائي ٿو true، ته b.equals(a)اهو پڻ موٽڻ گهرجي true.
  3. Transitivity: جيڪڏهن a.equals(b)اهو واپس اچي ٿو true۽ b.equals(c)پڻ موٽائي ٿو true، پوء c.equals(a)اهو پڻ موٽڻ گهرجي true.
  4. تسلسل: هڪ طريقي سان بار بار ڪالن کي equals()ساڳيو قدر واپس ڪرڻ گهرجي، جيستائين اعتراض جي ملڪيت جي قدرن مان ڪجهه تبديل نه ڪيا وڃن. يعني جاوا ۾ جيڪڏهن ٻه شيون برابر آهن ته پوءِ اهي برابر رهنديون جيستائين انهن جون ملڪيتون اڻ مٽ هونديون.
  5. Comparison null: اعتراض جي چڪاس ڪئي وڃي null. جيڪڏهن اعتراض برابر آهي null، ته پوء طريقو واپس اچڻ گهرجي false، نه NullPointerException. مثال طور، a.equals(null)ان کي واپس ڪرڻ گهرجي false.

جاوا ۾ برابر ۽ hashCode جي وچ ۾ معاهدو

  1. جيڪڏهن شيون طريقي جي عمل جي نتيجن ۾ برابر آهن equals، پوء انهن کي hashcodeساڳيو هجڻ گهرجي.
  2. جيڪڏهن شيون طريقي جي عمل جي نتيجن ۾ برابر نه آهن equals، پوء اهي hashcodeيا ته ساڳيا يا مختلف ٿي سگهن ٿا. بهرحال، ڪارڪردگي بهتر ڪرڻ لاء، اهو بهتر آهي ته مختلف شيون مختلف ڪوڊ واپس ڪن.

Как переопределять метод 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۽ ريپر ڪلاس جهڙوڪ Integer, Floatand Doubleoverride the method equals(), but StringBuffernot override.

  5. جڏهن به ممڪن هجي، جاوا ۾ متغير immutableاستعمال ڪندي فيلڊ ٺاهيو .final

  6. شين جو مقابلو ڪرڻ وقت String، استعمال ڪريو equals(). آپريٽر بدران ==.

  7. ٻه شيون جيڪي منطقي طور تي برابر آهن پر مختلف شين مان لوڊ ٿيل آهن ClassLoaderبرابر نه ٿي سگهن ٿيون. ياد رکو ته چيڪ ڪرڻ سان getClass()واپس ٿيندو falseجيڪڏهن لوڊر ڪلاس مختلف آهي.

  8. تشريح پڻ استعمال ڪريو @Override.طريقي تي hashCode، جيئن ته هي ذيلي غلطين کي روڪيندو آهي جيئن ته واپسي جي قيمت int. جڏهن ته، ڪجهه پروگرامر واپسي long.

پي ايس پيارا ساٿيو! مون هن مضمون کي سطح 21 مسئلن کي حل ڪرڻ ۾ ڪارائتو محسوس ڪيو! مان توهان کي هن موضوع جي تجزيو ڪرڻ ۾ سٺي قسمت جي خواهشمند آهيان، ترجمو استعمال ڪريو! مون کي اميد آهي ته توهان منهنجي درجه بندي کي وڌائڻ ۾ مدد ڪندا، ڇو ته هاڻي مان هن فورم تي ڪو به تبصرو نه ٿو ڪري سگهان. تمام گهڻو مهرباني، هرڪو! اصل مضمون مون خالي وقت جي گھٽتائي جي ڪري ڪجهه نقطا ختم ڪيا، پر مون هر شي جو ترجمو ڪيو جيڪو توهان کي ڄاڻڻ جي ضرورت آهي سطح 21 مسئلن کي حل ڪرڻ لاءِ.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION