JavaRush /جاوا بلاگ /Random-SD /برابر ۽ hashCode معاهدو يا جيڪو به آهي
Aleksandr Zimin
سطح
Санкт-Петербург

برابر ۽ hashCode معاهدو يا جيڪو به آهي

گروپ ۾ شايع ٿيل
جاوا پروگرامرز جي وڏي اڪثريت، يقينا، ڄاڻن ٿا ته طريقا هڪ ٻئي سان ويجهي سان لاڳاپيل equalsآهن hashCode، ۽ اهو مشورو ڏنو ويو آهي ته انهن ٻنهي طريقن کي انهن جي طبقن ۾ مسلسل ختم ڪرڻ لاء. ٿورڙو ننڍڙو نمبر ڄاڻن ٿا ته ائين ڇو آهي ۽ جيڪڏهن هن قاعدي کي ٽوڙيو وڃي ته ڪهڙا افسوسناڪ نتيجا ٿي سگهن ٿا. مان انهن طريقن جي تصور تي غور ڪرڻ جي تجويز پيش ڪريان ٿو، انهن جي مقصد کي ورجائي ٿو ۽ سمجھي ٿو ته اهي ايترو ڳنڍيل آهن. مون هي مضمون لکيو، اڳئين مضمون وانگر لوڊ ڪرڻ جي ڪلاسن بابت، پنهنجي لاءِ، آخرڪار مسئلي جي سڀني تفصيلن کي ظاهر ڪرڻ لاءِ ۽ هاڻي ٽئين پارٽي جي ذريعن ڏانهن واپس نه وڃان. ان ڪري، مون کي تخليقي تنقيد ڪرڻ ۾ خوشي ٿيندي، ڇو ته جيڪڏهن ڪٿي ڪٿي خال آهن، انهن کي ختم ڪرڻ گهرجي. مضمون، افسوس، ڪافي ڊگهو ٿي ويو.

اوور رائڊ قاعدن جي برابر آهي

جاوا ۾ ھڪڙو طريقو equals()گھربل آھي ان حقيقت جي تصديق يا انڪار ڪرڻ لاءِ ته ھڪ ئي اصل جا ٻه شيون منطقي طور تي برابر آھن . اهو آهي، جڏهن ٻن شين جي مقابلي ۾، پروگرامر کي سمجهڻ جي ضرورت آهي ته ڇا انهن جا اهم شعبا برابر آهن . اهو ضروري ناهي ته سڀئي شعبا هڪجهڙا هجن، ڇاڪاڻ ته طريقو منطقي برابريequals() جو مطلب آهي . پر ڪڏهن ڪڏهن هن طريقي کي استعمال ڪرڻ جي ڪا خاص ضرورت ناهي. جيئن ته چوندا آهن، هڪ خاص ميکانيزم کي استعمال ڪندي مسئلن کان بچڻ جو آسان طريقو ان کي استعمال ڪرڻ نه آهي. اهو پڻ ياد رکڻ گهرجي ته هڪ دفعو توهان هڪ معاهدو ٽوڙيو ٿا، توهان اهو سمجهڻ جو ڪنٽرول وڃائي ڇڏيو آهي ته ڪيئن ٻيون شيون ۽ اڏاوتون توهان جي اعتراض سان لهه وچڙ ۾ اينديون. ۽ بعد ۾ غلطي جو سبب ڳولڻ تمام ڏکيو ٿيندو. equals

جڏهن هن طريقي کي ختم ڪرڻ لاء نه

  • جڏهن ته هڪ طبقي جو هر مثال منفرد آهي.
  • وڏي حد تائين، هي انهن طبقن تي لاڳو ٿئي ٿو جيڪي ڊيٽا سان ڪم ڪرڻ جي بجاءِ مخصوص رويو مهيا ڪن ٿا. جهڙوڪ، مثال طور، طبقي جي طور تي Thread. انهن لاءِ equals، طبقي طرفان مهيا ڪيل طريقي تي عمل ڪرڻ Objectڪافي آهي. ٻيو مثال آهي enum classes ( Enum).
  • جڏهن حقيقت ۾ طبقي کي ان جي مثالن جي برابري جو تعين ڪرڻ جي ضرورت ناهي.
  • مثال طور، هڪ طبقي لاءِ java.util.Randomڪنهن به ضرورت نه آهي ته ڪلاس جي مثالن کي هڪ ٻئي سان ڀيٽڻ، اهو طئي ڪرڻ ته ڇا اهي بي ترتيب انگن جي ساڳي ترتيب کي واپس ڪري سگهن ٿا. صرف ان ڪري ته هن طبقي جي فطرت به اهڙي رويي کي ظاهر نٿو ڪري.
  • جڏهن توهان جنهن ڪلاس ۾ واڌ ڪري رهيا آهيو ان ۾ اڳ ۾ ئي ان جو پنهنجو لاڳو طريقو آهي equals۽ هن عمل درآمد جو رويو توهان لاءِ مناسب آهي.
  • مثال طور، طبقن لاء Set، List, Mapعمل درآمد equals۾ آهي AbstractSet، AbstractList۽ AbstractMapترتيب سان.
  • ۽ آخر ۾، اتي override ڪرڻ جي ڪا به ضرورت نه آهي equalsجڏهن توهان جي طبقي جو دائرو آهي privateيا package-private۽ توهان کي پڪ آهي ته هن طريقو ڪڏهن به نه سڏيو ويندو.

معاهدو برابر آهي

جڏهن هڪ طريقي کي ختم ڪري، equalsڊولپر کي جاوا ٻولي جي وضاحت ۾ بيان ڪيل بنيادي قاعدن تي عمل ڪرڻ گهرجي.
  • موٽڻ
  • ڪنهن به ڏنل قيمت لاء x، اظهار کي x.equals(x)واپس ڪرڻ گهرجي true.
    ڏنو ويو- معنيٰ اهڙوx != null
  • سميٽري
  • ڪنهن به ڏنل قدرن لاءِ x۽ y، صرف x.equals(y)موٽڻ گهرجي trueجيڪڏهن اهو y.equals(x)واپس اچي true.
  • منتقلي
  • ڪنهن به ڏنل قدر لاء x، y۽ z، جيڪڏهن x.equals(y)واپسي true۽ y.equals(z)واپسي true، x.equals(z)قيمت واپس ڪرڻ گهرجي true.
  • تسلسل
  • ڪنهن به ڏنل قدرن لاءِ، x۽ yبار بار ڪيل ڪال x.equals(y)پوئين ڪال جي قيمت هن طريقي کي واپس ڪندي، بشرطيڪ ته ٻن شين جي مقابلي لاءِ استعمال ٿيل فيلڊ ڪالن جي وچ ۾ تبديل نه ٿين.
  • مقابلي کان خالي
  • ڪنهن به ڏنل قيمت لاءِ xڪال x.equals(null)ضرور موٽڻ گهرجي false.

معاهدي جي ڀڃڪڙي جي برابر آهي

ڪيترائي طبقا، جهڙوڪ جاوا ڪليڪشن فريم ورڪ مان، طريقي جي عمل تي منحصر آهن equals()، تنهنڪري توهان کي ان کي نظرانداز نه ڪرڻ گهرجي، ڇاڪاڻ ته هن طريقي جي معاهدي جي خلاف ورزي جي درخواست جي غير معقول آپريشن کي رسي سگهي ٿو، ۽ هن معاملي ۾ ان جو سبب ڳولڻ لاء ڪافي ڏکيو ٿيندو. Reflexivity جي اصول موجب ، هر شئي پاڻ جي برابر هجڻ گهرجي. جيڪڏهن هن اصول جي ڀڃڪڙي ٿئي ٿي، جڏهن اسان ڪنهن شئي کي گڏ ڪرڻ ۾ شامل ڪريون ٿا ۽ پوءِ ان کي طريقي سان ڳولهي سگهون ٿا، contains()اسان اهو اعتراض نه ڳولي سگهنداسين، جيڪو اسان صرف مجموعي ۾ شامل ڪيو آهي. symmetry جي حالت ٻڌائي ٿي ته ڪا به ٻه شيون برابر هجڻ گهرجن بغير ڪنهن ترتيب جي، جنهن ۾ انهن جو مقابلو ڪيو وڃي. مثال طور، جيڪڏھن توھان وٽ ھڪڙو ڪلاس آھي جنھن ۾ صرف ھڪڙي فيلڊ اسٽرنگ قسم جي آھي، اھو غلط ٿيندو equalsھن فيلڊ کي ھڪڙي طريقي سان ھڪڙي اسٽرنگ سان. ڇاڪاڻ ته ريورس مقابلي جي صورت ۾، طريقو هميشه قدر واپس ڪندو false.
// Нарушение симметричности
public class SomeStringify {
    private String s;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o instanceof SomeStringify) {
            return s.equals(((SomeStringify) o).s);
        }
        // нарушение симметричности, классы разного происхождения
        if (o instanceof String) {
            return s.equals(o);
        }
        return false;
    }
}
//Правильное определение метода equals
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    return o instanceof SomeStringify &&
            ((SomeStringify) o).s.equals(s);
}
Transitivity جي حالت مان اهو معلوم ٿئي ٿو ته جيڪڏهن ڪنهن به ٽن شين مان ٻه برابر هجن ته ان صورت ۾ اهي ٽي شيون برابر هجڻ گهرجن. اهو اصول آسانيءَ سان ڀڃي سگهجي ٿو جڏهن ضروري هجي ته ڪنهن خاص بنيادي طبقي کي وڌائڻ لاءِ ان ۾ هڪ بامعني جزو شامل ڪري . Pointمثال طور، ڪوآرڊينيٽس سان ڪلاس ۾ x۽ yتوهان کي ان کي وڌائڻ سان پوائنٽ جو رنگ شامل ڪرڻو پوندو. ColorPointهن کي ڪرڻ لاء، توهان کي مناسب فيلڊ سان ڪلاس جو اعلان ڪرڻو پوندو color. اهڙيءَ طرح، جيڪڏهن وڌايل ڪلاس ۾ اسين equalsپيرين ميٿڊ کي سڏيندا آهيون، ۽ والدين ۾ فرض ڪريون ته صرف همراهن x۽ نسبتن کي y، ته پوءِ مختلف رنگن جا ٻه نقطا، پر هڪجهڙا هم آهنگي برابر سمجهيا ويندا، جيڪو غلط آهي. انهي حالت ۾، اهو ضروري آهي ته نڪتل طبقي کي رنگن ۾ فرق ڪرڻ سيکاريو وڃي. هن کي ڪرڻ لاء، توهان ٻه طريقا استعمال ڪري سگهو ٿا. پر هڪ symmetry جي اصول جي ڀڃڪڙي ڪندو ، ۽ ٻيو - transitivity .
// Первый способ, нарушая симметричность
// Метод переопределен в классе ColorPoint
@Override
public boolean equals(Object o) {
    if (!(o instanceof ColorPoint)) return false;
    return super.equals(o) && ((ColorPoint) o).color == color;
}
انهي صورت ۾، ڪال point.equals(colorPoint)واپسي قيمت ڏيندو true، ۽ مقابلو colorPoint.equals(point)موٽندو false، ڇاڪاڻ ته "ان جي" طبقي جي اعتراض جي توقع رکي ٿو. اهڙيء طرح، symmetry جي اصول جي ڀڃڪڙي آهي. ٻيو طريقو ان صورت ۾ "انڌو" چيڪ ڪرڻ ۾ شامل آهي جڏهن پوائنٽ جي رنگ بابت ڪا ڊيٽا نه آهي، يعني اسان وٽ ڪلاس آهي Point. يا رنگ چيڪ ڪريو جيڪڏهن ان بابت معلومات موجود آهي، يعني ڪلاس جي ڪنهن شئي جو مقابلو ڪريو ColorPoint.
// Метод переопределен в классе ColorPoint
@Override
public boolean equals(Object o) {
    if (!(o instanceof Point)) return false;

    // Слепая проверка
    if (!(o instanceof ColorPoint))
        return super.equals(o);

    // Полная проверка, включая цвет точки
    return super.equals(o) && ((ColorPoint) o).color == color;
}
Transitivity جي اصول جي خلاف ورزي هتي هيٺ ڏنل آهي. اچو ته چئون ته هيٺين شين جي هڪ تعريف آهي:
ColorPoint p1 = new ColorPoint(1, 2, Color.RED);
Point p2 = new Point(1, 2);
ColorPoint p3 = new ColorPoint(1, 2, Color.BLUE);
اهڙيء طرح، جيتوڻيڪ برابري p1.equals(p2)۽ مطمئن آهي p2.equals(p3)، p1.equals(p3)اهو قدر واپس ڪندو false. ساڳئي وقت، ٻيو طريقو، منهنجي خيال ۾، گهٽ پرڪشش نظر اچي ٿو، ڇاڪاڻ ته ڪجھ ڪيسن ۾، الورورٿم انڌو ٿي سگھي ٿو ۽ مقابلو مڪمل طور تي انجام نه ڏئي سگھي ٿو، ۽ توھان ان بابت نه ڄاڻندا. عام طور تي، جيئن مان سمجهان ٿو ته، هن مسئلي جو ڪو به ٺوس حل ناهي. Kay Horstmann نالي هڪ مستند ليکڪ جي راءِ آهي ته توهان آپريٽر جي استعمال کي instanceofهڪ ميٿڊ ڪال سان بدلائي سگهو ٿا getClass()جيڪو شئي جو طبقو واپس ڪري ٿو ۽، ان کان اڳ جو توهان پنهنجو پاڻ ۾ شيون موازنہ ڪرڻ شروع ڪريو، پڪ ڪريو ته اهي هڪ ئي قسم جا آهن. ، ۽ انهن جي عام اصل جي حقيقت ڏانهن ڌيان نه ڏيو. اهڙيء طرح، symmetry ۽ transitivity جي ضابطن کي مطمئن ڪيو ويندو. پر ساڳئي وقت، بيريڪيڊ جي ٻئي پاسي هڪ ٻيو ليکڪ بيٺو آهي، جيڪو وسيع حلقن ۾ گهٽ عزت وارو نه آهي، جوشوا بلوچ، جيڪو يقين رکي ٿو ته اهو طريقو باربرا ليسڪوف جي متبادل اصول جي ڀڃڪڙي آهي. اهو اصول ٻڌائي ٿو ته ”ڪالنگ ڪوڊ لازمي طور تي بنيادي ڪلاس سان ان جي ذيلي طبقن وانگر ان کي ڄاڻڻ کان سواءِ . ۽ Horstmann جي تجويز ڪيل حل ۾، هي اصول واضح طور تي ڀڃڪڙي آهي، ڇاڪاڻ ته اهو ان تي عمل ڪرڻ تي منحصر آهي. مختصر ۾، اهو واضح آهي ته معاملو اونداهي آهي. اهو پڻ ياد رکڻ گهرجي ته هورسٽمن پنهنجي طريقي کي لاڳو ڪرڻ لاء قاعدو واضح ڪري ٿو ۽ صاف انگريزي ۾ لکي ٿو ته توهان کي هڪ حڪمت عملي جو فيصلو ڪرڻ جي ضرورت آهي جڏهن ڪلاس ٺاهيندي، ۽ جيڪڏهن برابري جي جانچ صرف سپر ڪلاس طرفان ڪئي ويندي، توهان اهو ڪري سگهو ٿا. آپريشن instanceof_ ٻي صورت ۾، جڏهن چيڪ جي سيمينٽڪس نڪتل طبقي جي بنياد تي تبديل ٿي ۽ طريقي جي عمل کي ترتيب ڏيڻ جي ضرورت آهي، توهان کي لازمي طور تي استعمال ڪرڻ گهرجي getClass(). جوشوا بلوچ، موڙ ۾، وراثت کي ڇڏي ڏيڻ ۽ ڪلاس ۾ هڪ ColorPointطبقي کي شامل ڪندي اعتراض جي جوڙجڪ کي استعمال ڪرڻ Point۽ asPoint()خاص طور تي نقطي بابت معلومات حاصل ڪرڻ لاء رسائي جو طريقو مهيا ڪرڻ جي تجويز پيش ڪري ٿو. اهو سڀني ضابطن کي ٽوڙڻ کان پاسو ڪندو، پر، منهنجي خيال ۾، اهو ڪوڊ کي وڌيڪ سمجهڻ ڏکيو ٿيندو. ٽيون اختيار IDE استعمال ڪندي برابر طريقي جي خودڪار نسل کي استعمال ڪرڻ آهي. Idea، رستي ۾، Horstmann نسل کي ٻيهر پيدا ڪري ٿو، توهان کي هڪ حڪمت عملي چونڊڻ جي اجازت ڏئي ٿي هڪ سپر ڪلاس يا ان جي اولاد ۾ هڪ طريقو لاڳو ڪرڻ لاء. آخرڪار، ايندڙ تسلسل جو قاعدو ٻڌائي ٿو ته جيتوڻيڪ شيون تبديل xنه ٿيون yٿين، انهن کي ٻيهر سڏڻ x.equals(y)لازمي طور تي ساڳيو قدر واپس ڪرڻ گهرجي. آخري اصول اهو آهي ته ڪابه شئي برابر نه هجڻ گهرجي null. هتي سڀ ڪجهه واضح آهي null- اها غير يقيني صورتحال آهي، ڇا اعتراض غير يقيني صورتحال جي برابر آهي؟ اهو واضح ناهي، يعني false.

برابري کي طئي ڪرڻ لاءِ عام الگورتھم

  1. اعتراض جي حوالن this۽ طريقي جي ماپن جي برابري لاء چيڪ ڪريو o.
    if (this == o) return true;
  2. چيڪ ڪريو ته ڇا لنڪ بيان ڪيل آهي o، يعني ڇا اهو آهي null.
    جيڪڏهن مستقبل ۾، جڏهن اعتراض جي قسمن جي مقابلي ۾، آپريٽر استعمال ڪيو ويندو instanceof، هن شيء کي ڇڏي سگهجي ٿو، ڇاڪاڻ ته هي پيٽرولر falseهن صورت ۾ واپس اچي ٿو null instanceof Object.
  3. هڪ آپريٽر يا طريقو thisاستعمال ڪندي اعتراض جي قسمن جو مقابلو ڪريو ، مٿي ڏنل بيان ۽ توهان جي پنهنجي وجدان جي رهنمائي سان.oinstanceofgetClass()
  4. جيڪڏهن هڪ طريقو equalsذيلي ڪلاس ۾ ختم ڪيو ويو آهي، هڪ ڪال ڪرڻ جي پڪ ڪريوsuper.equals(o)
  5. تبديل ڪريو پيٽرولر جي قسم oکي گهربل ڪلاس ۾.
  6. سڀني اهم اعتراض جي شعبن جي مقابلي کي انجام ڏيو:
    • ابتدائي قسمن لاء (سواء float۽ double)، آپريٽر استعمال ڪندي==
    • حوالن جي شعبن لاءِ توھان کي انھن جي طريقي کي سڏڻ جي ضرورت آھيequals
    • arrays لاءِ، توھان استعمال ڪري سگھو ٿا cyclic iteration يا طريقوArrays.equals()
    • قسمن لاءِ float۽ doubleان لاءِ ضروري آهي ته لاڳاپيل لفافي طبقن جي مقابلي جا طريقا استعمال ڪن Float.compare()۽Double.compare()
  7. ۽ آخر ۾، ٽن سوالن جا جواب ڏيو: ڇا لاڳو ٿيل طريقو سميٽرڪ آهي ؟ منتقلي ؟ اتفاق ڪيو ؟ ٻيا ٻه اصول ( اضطراب ۽ يقين ) عام طور تي خودڪار طريقي سان ڪيا ويندا آهن.

HashCode اوور رائڊ ضابطا

هيش هڪ عدد آهي جيڪو ڪنهن شئي مان پيدا ٿئي ٿو جيڪو پنهنجي حالت بيان ڪري ٿو ڪنهن وقت ۾. هي نمبر جاوا ۾ بنيادي طور تي هيش ٽيبل ۾ استعمال ٿيندو آهي جهڙوڪ HashMap. انهي صورت ۾، هڪ اعتراض جي بنياد تي نمبر حاصل ڪرڻ جو هيش فنڪشن لازمي طور تي لاڳو ڪيو وڃي ته جيئن هيش ٽيبل تي عناصر جي نسبتا برابر تقسيم کي يقيني بڻائي سگهجي. ۽ پڻ تصادم جي امڪان کي گھٽائڻ لاءِ جڏهن فنڪشن مختلف ڪنجين لاءِ ساڳيو قدر واپس ڪري ٿو.

معاهدو هيش ڪوڊ

هيش فنڪشن کي لاڳو ڪرڻ لاء، ٻولي جي وضاحت هيٺ ڏنل قاعدن کي بيان ڪري ٿو:
  • هڪ ئي شئي تي هڪ يا وڌيڪ ڀيرا هڪ طريقي کي ڪال ڪرڻ hashCodeلازمي طور تي ساڳيو هش ويل واپس ڪرڻ گهرجي، بشرطيڪ ته اعتراض جي فيلڊ ۾ شامل ڪيل قيمت کي تبديل نه ڪيو وڃي.
  • ٻن شين تي هڪ طريقي کي ڪال ڪرڻ hashCodeهميشه ساڳئي نمبر کي موٽڻ گهرجي جيڪڏهن شيون برابر آهن ( equalsانهن شين تي هڪ طريقو سڏيندو آهي واپسي true).
  • ٻن غير مساوي شين تي هڪ طريقو سڏڻ hashCodeلازمي آهي ته مختلف هيش قدر واپس ڪن. جيتوڻيڪ هي گهرج لازمي نه آهي، اهو سمجهڻ گهرجي ته ان جي عمل کي هاش ٽيبل جي ڪارڪردگي تي مثبت اثر ٿيندو.

برابر ۽ hashCode طريقن کي گڏ ڪرڻ گهرجي

مٿي بيان ڪيل معاهدن جي بنياد تي، اهو هيٺ ڏنل آهي ته جڏهن توهان جي ڪوڊ ۾ طريقي کي ختم ڪيو وڃي equals، توهان کي هميشه طريقي سان ختم ڪرڻ گهرجي hashCode. جيئن ته حقيقت ۾ هڪ طبقي جا ٻه مثال مختلف آهن ڇاڪاڻ ته اهي مختلف ميموري علائقن ۾ آهن، انهن کي ڪجهه منطقي معيار جي مطابق مقابلو ڪرڻو پوندو. ان جي مطابق، ٻه منطقي طور تي هڪجهڙائي واري شين کي هڪ ئي هش قدر واپس ڪرڻ گهرجي. ڇا ٿيندو جيڪڏهن انهن مان صرف هڪ طريقو ختم ڪيو وڃي؟
  1. equalsها hashCodeنه

    اچو ته چئون ته اسان equalsپنهنجي ڪلاس ۾ هڪ طريقي جي صحيح وضاحت ڪئي، ۽ hashCodeاهو طريقو ڇڏڻ جو فيصلو ڪيو جيئن اهو ڪلاس ۾ آهي Object. پوءِ طريقي جي نقطي نظر کان equalsٻئي شيون منطقي طور تي برابر هونديون، جڏهن ته طريقي جي نقطي نظر کان hashCodeانهن ۾ ڪا به شيءِ مشترڪ نه هوندي. ۽ اهڙيءَ طرح، ڪنهن شئي کي هيش ٽيبل ۾ رکڻ سان، اسان ان کي واپس نه وٺڻ جي خطري کي هلائيندا آهيون ڪنجي ذريعي.
    مثال طور، هن طرح:

    Map<Point, String> m = new HashMap<>();
    m.put(new Point(1, 1),Point A);
    // pointName == null
    String pointName = m.get(new Point(1, 1));

    ظاهر آهي، اعتراض رکيل آهي ۽ اعتراض جي ڳولا ڪئي پئي وڃي ٻه مختلف شيون آهن، جيتوڻيڪ اهي منطقي طور تي برابر آهن. پر، ڇاڪاڻ ته انهن وٽ مختلف هيش قدر آهن ڇو ته اسان معاهدي جي ڀڃڪڙي ڪئي آهي، اسان اهو چئي سگهون ٿا ته اسان هيش ٽيبل جي آنڊن ۾ پنهنجو اعتراض وڃائي ڇڏيو.

  2. hashCodeها equalsنه.

    ڇا ٿيندو جيڪڏهن اسان طريقي کي ختم ڪريون hashCode۽ equalsڪلاس مان طريقي جي عمل کي ورثي ۾ آڻيون Object. جيئن توهان ڄاڻو ٿا، equalsڊفالٽ طريقو صرف اشارن سان اشارن جو مقابلو ڪري ٿو، اهو طئي ڪرڻ ته ڇا اهي ساڳيا اعتراض ڏانهن اشارو ڪن ٿا. اچو ته فرض ڪريون ته hashCodeاسان طريقو سڀني ڪينن جي مطابق لکيو آهي، يعني ان کي IDE استعمال ڪندي پيدا ڪيو، ۽ اهو منطقي طور تي هڪجهڙائي واري شين لاءِ ساڳيا هيش ويل واپس ڪندو. ظاهر آهي، ائين ڪرڻ سان اسان اڳ ۾ ئي ٻن شين جي مقابلي لاءِ ڪجهه ميکانيزم جي وضاحت ڪري چڪا آهيون.

    تنهن ڪري، پوئين پيراگراف مان مثال نظريي ۾ ڪيو وڃي. پر اسان اڃا تائين هيش ٽيبل ۾ اسان جي اعتراض کي ڳولڻ جي قابل نه هوندا. جيتوڻيڪ اسان هن جي ويجهو ٿينداسين، ڇاڪاڻ ته گهٽ ۾ گهٽ اسان کي هڪ هيش ٽيبل جي ٽوڪري ملندي جنهن ۾ اعتراض ڪوڙ هوندو.

    هيش ٽيبل ۾ ڪنهن شئي کي ڪاميابيءَ سان ڳولڻ لاءِ، ڪي جي هيش ويلز جي مقابلي ڪرڻ کان علاوه، سرچ ڪيل اعتراض سان ڪي جي منطقي برابري جو تعين پڻ استعمال ڪيو ويندو آهي. اهو آهي، equalsطريقي کي ختم ڪرڻ کان سواء ڪو به طريقو ناهي.

hashCode کي طئي ڪرڻ لاءِ عام الگورتھم

هتي، اهو مون کي لڳي ٿو، توهان کي تمام گهڻو پريشان نه ڪرڻ گهرجي ۽ پنهنجي پسنديده IDE ۾ طريقو ٺاهيو. ڇاڪاڻ ته اهي سڀئي بٽ ساڄي ۽ کاٻي طرف گولڊن تناسب جي ڳولا ۾، يعني، عام تقسيم - اهو مڪمل طور تي ضدي دوستن لاء آهي. ذاتي طور تي، مون کي شڪ آهي ته مان ساڳئي خيال کان بهتر ۽ تيز ڪري سگهان ٿو.

نتيجي جي بدران

اهڙيء طرح، اسان ڏسون ٿا ته طريقا جاوا ٻوليء ۾ هڪ چڱي طرح بيان ڪيل ڪردار equalsادا ڪن ٿا ۽ ٻن شين جي منطقي مساوات جي خاصيت حاصل ڪرڻ لاء ٺهيل آهن. hashCodeطريقي جي صورت ۾، equalsهن جو هڪ سڌو تعلق آهي شين جي مقابلي سان، hashCodeهڪ اڻ سڌي طرح جي صورت ۾، جڏهن اهو ضروري هجي، اچو ته چئو، هيش ٽيبل يا ساڳي ڊيٽا جي جوڙجڪ ۾ ڪنهن شئي جي تقريبن جڳهه کي طئي ڪرڻ لاء. اعتراض جي ڳولا جي رفتار کي وڌايو. معاهدن کان علاوه ، equalsاتي hashCodeهڪ ٻي گهرج آهي شين جي مقابلي سان لاڳاپيل. هي هڪ compareToانٽرفيس جي طريقي جي مطابقت آهي . اها گهرج ڊولپر کي پابند ڪري ٿي ته هميشه واپس اچي جڏهن . اهو آهي، اسان ڏسون ٿا ته ٻن شين جو منطقي مقابلو ايپليڪيشن ۾ ڪٿي به تضاد نه هجڻ گهرجي ۽ هميشه هڪجهڙائي هجڻ گهرجي. Comparableequalsx.equals(y) == truex.compareTo(y) == 0

ذريعا

مؤثر جاوا، ٻيو ايڊيشن. جوشوا بلوچ. تمام سٺي ڪتاب جو مفت ترجمو. جاوا، هڪ پروفيسر جي لائبريري. جلد 1. بنياديات. Kay Horstmann. ٿورو گهٽ نظريو ۽ وڌيڪ مشق. پر هر شيءِ جو تجزيو نه ڪيو ويو آهي جيترو تفصيل سان بلوچ جي. جيتوڻيڪ اتي ئي هڪ نظر آهي برابر برابر (). تصويرن ۾ ڊيٽا جي جوڙجڪ. HashMap جاوا ۾ HashMap ڊوائيس تي هڪ انتهائي مفيد مضمون. ذريعن کي ڏسڻ بدران.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION