JavaRush /Java Blog /Random-TL /Ang overloading ay katumbas ng() at hashCode() na mga pam...
Coder
Antas

Ang overloading ay katumbas ng() at hashCode() na mga pamamaraan sa Java

Nai-publish sa grupo

Overriding equals() at hashCode() na mga pamamaraan sa Java

Equalsat hashCodeang mga pangunahing pamamaraan na ipinahayag sa klase Objectat nakapaloob sa mga karaniwang aklatan ng Java. Ang overloading ay katumbas ng() at hashCode() na mga pamamaraan sa Java - 1Ang pamamaraan еquals()ay ginagamit upang ihambing ang mga bagay at hashCodeupang makabuo ng isang integer code para sa bagay. Ang mga pamamaraang ito ay malawakang ginagamit sa mga karaniwang aklatan ng Java kapag naglalagay at kumukuha ng mga bagay sa HashMap. equalGinagamit din ang pamamaraan upang matiyak na ang mga natatanging bagay lamang ang nakaimbak sa HashSetiba pang Setmga pagpapatupad, gayundin sa anumang iba pang mga kaso kung saan ang mga bagay ay kailangang ikumpara. Ang default na pagpapatupad ng pamamaraan equals()sa klase java.lang.Objectay naghahambing ng mga sanggunian sa mga memory address na iniimbak ng mga variable at ibabalik truelamang kung ang mga address ay tumutugma, sa madaling salita, ang mga variable ay tumutukoy sa parehong bagay. Inirerekomenda ng Java na i-override ang equals()at mga pamamaraan hashCode()kung inaasahan mong gagawin ang paghahambing ayon sa natural na lohika o lohika ng negosyo. Maraming mga klase sa mga karaniwang aklatan ng Java ang nag-o-override sa kanila, halimbawa, ang klase ay Stringnag-o-override equalsupang ito ay bumalik truekung ang mga nilalaman ng dalawang bagay na pinaghahambing ay pareho. Ino-override ng klase ng wrapper Integerang paraan equalupang magsagawa ng paghahambing na numero, at iba pa. Dahil umaasa HashMapdin HashTableang Java equals()at mga pamamaraan hashCode()upang ihambing ang kanilang keyat values, nag-aalok ang Java ng mga sumusunod na panuntunan para sa pag-override sa mga pamamaraang ito:
  1. Reflexivity: Ang bagay ay dapat na katumbas ng sarili nito.
  2. Symmetrical: kung a.equals(b)ito ay bumalik true, b.equals(a)dapat din itong bumalik true.
  3. Transitivity: kung a.equals(b)ito ay bumalik trueat b.equals(c)bumalik din true, c.equals(a)dapat din itong bumalik true.
  4. Consistency: Ang mga paulit-ulit na tawag sa isang paraan equals()ay dapat magbalik ng parehong halaga hangga't ang ilan sa mga value ng property ng object ay hindi nabago. Iyon ay, kung ang dalawang bagay ay pantay sa Java, kung gayon sila ay magiging pantay hangga't ang kanilang mga katangian ay mananatiling hindi nagbabago.
  5. Paghahambing null: Dapat suriin ang bagay para sa null. Kung ang bagay ay katumbas ng null, kung gayon ang pamamaraan ay dapat bumalik false, hindi NullPointerException. Halimbawa, a.equals(null)dapat itong bumalik false.

Kasunduan sa pagitan ng equals at hashCode sa Java

  1. Kung ang mga bagay ay pantay sa mga resulta ng method execution equals, hashcodedapat pareho ang mga ito.
  2. Kung ang mga bagay ay hindi pantay-pantay sa mga resulta ng pagpapatupad ng pamamaraan equals, maaari silang hashcodemaging pareho o magkaiba. Gayunpaman, upang mapabuti ang pagganap, mas mahusay na magkaroon ng iba't ibang mga bagay na nagbabalik ng iba't ibang mga code.

Paano i-override ang katumbas na pamamaraan sa Java

  1. @Override
    public boolean equals(Object obj) {
    /*1. Check*/if (obj == this) {
    /*and return */ return true;
             }
  2. Suriin ang bagay para sa null, at suriin din kung ang mga bagay ay pareho ang uri. Huwag suriin instanceofdahil babalik ito truepara sa mga subclass at gagana lamang nang tama kung ang iyong klase ay idineklara bilang immutable. Pwede mong gamitin getClass();

    if (obj == null || obj.getClass() != this.getClass()) {
                return false;
    }
  3. Magdeklara ng variable ng uri na iyong inihahambing at i-cast objsa ganoong uri. Pagkatapos ay ihambing ang bawat uri ng attribute, simula sa mga numeric na attribute (kung mayroon man) dahil ang mga numeric na attribute ay mas mabilis na sinusuri. Ihambing ang mga katangian gamit ang AND at OR operator (tinatawag na short-circuit logical operators) upang pagsamahin ang mga pagsusuri sa iba pang mga katangian.

    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())));
    }
Kumpletong halimbawa ng overriding equals method sa 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;
    }
 }

Mga Karaniwang Pagkakamali Kapag ang Overriding ay katumbas sa Java

  1. Sa halip na i-override ang pamamaraan, equals (Override)na-overload ito ng programmer. (Overload)Ang syntax ng isang pamamaraan equals()sa isang klase Objectay tinukoy bilang public boolean equals(Object obj), ngunit maraming programmer ang hindi sinasadyang na-overload ang pamamaraan: public boolean equals(Person obj)- sa halip na Objectgamitin ang pangalan ng klase nito bilang argumento (hal. Tao). Ang error na ito ay mahirap matukoy dahil sa static binding. Kaya, kung tatawagin mo ang pamamaraang ito sa isang bagay ng iyong klase, ang pamamaraan ay hindi lamang mag-compile, ngunit gagawin pa rin ito ng tama. Gayunpaman, kung ilalagay mo ang iyong bagay sa isang koleksyon, halimbawa, ArrayListat tumawag sa isang pamamaraan contains()na ang operasyon ay batay sa pamamaraan equals(), containshindi matukoy ng pamamaraan ang iyong bagay.

  2. Kapag nag-o-override sa isang paraan, equals()huwag suriin kung may nullmga variable, na sa huli ay mapupunta NullPointerExceptionkapag tumatawag equals(). Nasa ibaba ang tamang code.

    firstname == guest.firstname || (firstname != null &&
         firstname.equals(guest.firstname));
  3. Ang pangatlong karaniwang pagkakamali ay hindi ang pag-override sa pamamaraan hashCode(), ngunit ang equals(). Kinakailangan mong i-override ang parehong mga pamamaraan sa Java equals()din . hashCode()Ang pamamaraan hashCodeay ginagamit sa hash-collections (halimbawa HashSet), at mas kaunting mga banggaan ang mayroon (parehong code para sa iba't ibang mga bagay), mas mahusay na gagana ang mga koleksyong ito sa mga bagay ng iyong klase.

  4. Ang huling karaniwang pagkakamali ng mga programmer ay kapag nag-o-override sa isang paraan, equals()ang pagmamapa sa pagitan ng mga pamamaraan equals()at hindi pinapanatili compareTo(), na isang impormal na kinakailangan upang maiwasan ang pag-imbak ng mga duplicate sa Set (SortedSet, TreeSet).

Mga tip sa kung paano isulat ang katumbas na pamamaraan sa Java

  1. Karamihan sa mga IDE tulad ng NetBeans, Eclipse at IntelliJ IDEA ay nagbibigay ng suporta para sa pagbuo ng mga pamamaraan equals()at hashCode(). Sa Eclipse, i-right click -> source -> generate equals()at hashCode().

  2. Kung ang klase ay may natatanging business key, magiging sapat na upang suriin lamang ang pagkakapantay-pantay ng mga field na ito. Tulad ng sa aming halimbawa, ang "id" ay isang natatanging numero para sa bawat Tao.

  3. Kapag nag-o-override hashCode()sa Java, tiyaking gamitin ang lahat ng field na ginamit sa pamamaraan equals().

  4. Stringat mga klase ng wrapper tulad ng Integer, Floatat Doublei-override ang method equals(), ngunit StringBufferhindi na-override.

  5. Hangga't maaari, gumawa ng mga field immutablegamit finalang mga variable sa Java.

  6. Kapag naghahambing Stringng mga bagay, gamitin equals()sa halip ang operator na ==.

  7. Ang dalawang bagay na lohikal na magkapareho ngunit na-load mula sa magkaibang mga bagay ClassLoaderay hindi maaaring magkapantay. Tandaan na ang pagsuri sa getClass()ay babalik falsekung ang klase ng loader ay iba.

  8. Gamitin @Overridedin ang anotasyon sa pamamaraang . hashCode, dahil pinipigilan nito ang mga banayad na error tulad ng halaga ng pagbabalik ng int. Gayunpaman, nagbabalik ang ilang programmer long.

PS Minamahal na mga kasamahan! Nakita kong kapaki-pakinabang ang artikulong ito sa paglutas ng mga problema sa antas 21! Nais kong good luck sa pagsusuri sa paksang ito, gamitin ang pagsasalin! Umaasa ako na tulungan mo akong itaas ang aking rating, dahil ngayon ay hindi ako makapag-iwan ng komento sa forum na ito. Maraming salamat, sa lahat! Orihinal na artikulo Inalis ko ang ilang puntos dahil sa kakulangan ng libreng oras, ngunit isinalin ko ang lahat ng kailangan mong malaman upang malutas ang mga problema sa antas 21.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION