JavaRush /جاوا بلاگ /Random-UR /جاوا میں اوورلوڈنگ برابر () اور ہیش کوڈ () طریقے
Coder
سطح

جاوا میں اوورلوڈنگ برابر () اور ہیش کوڈ () طریقے

گروپ میں شائع ہوا۔

جاوا میں برابر () اور ہیش کوڈ () طریقوں کو اوور رائیڈ کرنا

Equalsاور hashCodeکلاس میں اعلان کردہ Objectاور معیاری جاوا لائبریریوں میں موجود بنیادی طریقے ہیں۔ جاوا میں اوورلوڈنگ برابر () اور ہیش کوڈ () طریقے - 1یہ طریقہ еquals()اشیاء کا موازنہ کرنے اور hashCodeآبجیکٹ کے لیے ایک عدد کوڈ بنانے کے لیے استعمال کیا جاتا ہے۔ یہ طریقے جاوا معیاری لائبریریوں میں بڑے پیمانے پر استعمال ہوتے ہیں جب میں اشیاء کو داخل اور بازیافت کرتے ہیں HashMap۔ اس طریقہ کار کا equalاستعمال اس بات کو یقینی بنانے کے لیے بھی کیا جاتا ہے کہ صرف منفرد اشیاء کو HashSetدیگر Setنفاذات میں ذخیرہ کیا جاتا ہے، اور ساتھ ہی کسی بھی دوسری صورت میں جہاں اشیاء کا موازنہ کرنے کی ضرورت ہوتی ہے۔ equals()کلاس میں طریقہ کار کا پہلے سے طے شدہ نفاذ java.lang.Objectان میموری ایڈریسز سے حوالہ جات کا موازنہ کرتا ہے جو متغیرات اسٹور کرتے ہیں اور trueصرف اس صورت میں واپس آتے ہیں جب ایڈریسز آپس میں مماثل ہوں، دوسرے لفظوں میں، متغیرات ایک ہی چیز کا حوالہ دیتے ہیں۔ اگر آپ توقع کرتے ہیں کہ موازنہ قدرتی منطق یا کاروباری منطق کے مطابق کیا جائے تو جاوا equals()اور طریقوں کو اوور رائیڈ کرنے کی تجویز کرتا ہے۔ hashCode()معیاری جاوا لائبریریوں میں بہت سی کلاسیں ان کو اوور رائیڈ کرتی ہیں، مثال کے طور پر کلاس کو Stringاوور رائیڈ کرتا ہے equalsتاکہ یہ واپس آجائے trueاگر ان دونوں اشیاء کے مواد کا موازنہ کیا جا رہا ہے۔ ریپر کلاس عددی موازنہ کرنے کے Integerطریقہ کو اوور رائیڈ کرتی ہے equal، وغیرہ۔ چونکہ جاوا ان کے اور کا موازنہ کرنے کے طریقوں پر HashMapبھی انحصار کرتا ہے ، جاوا ان طریقوں کو اوور رائیڈ کرنے کے لیے درج ذیل اصول پیش کرتا ہے۔ HashTableequals()hashCode()keyvalues
  1. اضطراری صلاحیت: آبجیکٹ کو اپنے برابر ہونا چاہیے۔
  2. سڈول: اگر 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. موازنہ null: آبجیکٹ کو چیک کرنا ضروری ہے null۔ اگر اعتراض کے برابر ہے null، تو طریقہ واپس آنا چاہیے false، نہیں NullPointerException۔ مثال کے طور پر، a.equals(null)اسے واپس آنا چاہیے false۔

جاوا میں مساوی اور ہیش کوڈ کے درمیان معاہدہ

  1. اگر آبجیکٹ طریقہ کار پر عمل درآمد کے نتائج میں برابر ہیں equals، تو انہیں hashcodeایک جیسا ہونا چاہیے۔
  2. اگر طریقہ کار کے نتائج میں اشیاء برابر نہیں ہیں equals، تو وہ hashcodeیا تو ایک جیسے یا مختلف ہو سکتے ہیں۔ تاہم، کارکردگی کو بہتر بنانے کے لیے، یہ بہتر ہے کہ مختلف اشیاء مختلف کوڈز واپس کریں۔

جاوا میں مساوی طریقہ کو کیسے اوور رائڈ کریں۔

  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, Floatاور Doubleطریقہ کو اوور رائیڈ کرتا ہے equals()لیکن StringBufferاوور رائڈ نہیں کرتا۔

  5. جب بھی ممکن ہو، جاوا میں متغیرات کا immutableاستعمال کرتے ہوئے فیلڈز بنائیں ۔final

  6. اشیاء کا موازنہ کرتے وقت String، equals()اس کے بجائے . operator استعمال کریں ==۔

  7. دو اشیاء جو منطقی طور پر برابر ہیں لیکن مختلف اشیاء سے بھری ہوئی ہیں ClassLoaderبرابر نہیں ہو سکتیں۔ یاد رکھیں کہ اگر لوڈر کلاس مختلف ہے تو اس کے ساتھ چیکنگ getClass()واپس آ جائے گی ۔false

  8. @Overrideتشریح کو . طریقہ پر بھی استعمال کریں hashCode، کیونکہ یہ ٹھیک ٹھیک غلطیوں کو روکتا ہے جیسے کی واپسی کی قدر int، تاہم، کچھ پروگرامرز واپس آتے ہیں long۔

PS پیارے ساتھیو! میں نے یہ مضمون لیول 21 کے مسائل کو حل کرنے میں مفید پایا! میری خواہش ہے کہ آپ اس موضوع کا تجزیہ کریں، ترجمہ استعمال کریں! مجھے امید ہے کہ آپ میری ریٹنگ بڑھانے میں میری مدد کریں گے، کیونکہ اب میں اس فورم پر کوئی تبصرہ بھی نہیں کر سکتا۔ بہت شکریہ، سب! اصل مضمون میں نے فارغ وقت کی کمی کی وجہ سے کچھ نکات کو چھوڑ دیا، لیکن میں نے ہر وہ چیز ترجمہ کر دی جو آپ کو لیول 21 کے مسائل کو حل کرنے کے لیے جاننے کی ضرورت ہے۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION