Sobes.tech
Junior

Javaда equals() ыкмасы эмне кылат?

sobes.tech AI

AIден жооп

Javaда equals() ыкмасы эки объекттин мазмунун салыштыруу үчүн колдонулат. Деги, эгер эч кандай өзгөртүүлөр жасалбаса, Object класста ал объекттердин шилтемелерин салыштырат, башкача айтканда, эки өзгөрмө бир эле эс тутум объектине шилтеме кылып жатабы же жокпу деп аныктайт:

Бирок, Javaнын көпчүлүк класстары (мисалы, String, Integer) бул ыкманы кайра аныктап, объекттердеги маанилерди салыштырат, шилтемелерин эмес:

equals() ыкмасын кайра аныктап жатканда, анын контрактун сактоо маанилүү:

  • Рефлексивдүүлүк: x.equals(x) бардык нөл эмес x үчүн true болушу керек.
  • Симметриялыктык: x.equals(y) true болсо, анда y.equals(x) да true болушу керек, бардык нөл эмес x жана y үчүн.
  • Транзитивдүүлүк: Эгер x.equals(y) жана y.equals(z) true болсо, анда x.equals(z) да true болушу керек, бардык нөл эмес x, y, жана z үчүн.
  • Туруктуулук: Көп жолу чакырылган x.equals(y) бирдей натыйжа бериши керек, эгер объекттер өзгөртүлбөсө.
  • Нөл эмес x үчүн, x.equals(null) false болушу керек.

equals() ыкмасын кайра аныктоо мисалы:

class MyObject {
    private int value;

    public MyObject(int value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        MyObject myObject = (MyObject) obj;
        return value == myObject.value;
    }
}

equals() колдонуу:

// шилтемени салыштыруу (негизги `Object`те)
Object obj1 = new Object();
Object obj2 = new Object();
boolean byReference = obj1.equals(obj2); // false

// маанини салыштыруу (өзгөртүлгөн `equals` аркылуу)
MyObject myObj1 = new MyObject(10);
MyObject myObj2 = new MyObject(10);
boolean byValue = myObj1.equals(myObj2); // true

Мындан тышкары, hashCode() ыкмасын да кайра аныктоо маанилүү, анткени ал equals() менен шарттарды сактап, хештөө колдонмолорунда (мисалы, HashMap, HashSet) туура иштешин камсыз кылат.