JavaRush /جاوا بلاگ /Random-SD /برابر ۽ hashCode طريقا: استعمال جو مشق

برابر ۽ hashCode طريقا: استعمال جو مشق

گروپ ۾ شايع ٿيل
سلام! اڄ اسان جاوا ۾ ٻن اهم طريقن بابت ڳالهائينداسين - equals()۽ hashCode(). هي پهريون ڀيرو نه آهي جو اسان انهن سان مليا آهيون: جاوا رش ڪورس جي شروعات ۾ ان بابت هڪ مختصر ليڪچرequals() هو - ان کي پڙهو جيڪڏهن توهان ان کي وساري ڇڏيو آهي يا اڳ ۾ نه ڏٺو آهي. طريقن جي برابر آهي &  hashCode: استعمال جي مشق - 1اڄ جي سبق ۾ اسين انهن تصورن بابت تفصيل سان ڳالهائينداسين - مون تي يقين ڪريو، ڳالهائڻ لاءِ گهڻو ڪجهه آهي! ۽ ان کان اڳ جو اسان ڪنهن نئين شيءِ ڏانهن وڃون، اچو ته پنهنجي يادگيري کي تازو ڪريون ان تي جيڪي اسان اڳ ۾ ئي ڍڪي چڪا آهيون :) جيئن توهان کي ياد آهي، ”” آپريٽر استعمال ڪندي ٻن شين جو معمولي مقابلو ==خراب خيال آهي، ڇاڪاڻ ته “ ==” حوالن جو مقابلو ڪري ٿو. هتي اسان جو مثال آهي ڪارن سان گڏ هڪ تازي ليڪچر مان:
public class Car {

   String model;
   int maxSpeed;

   public static void main(String[] args) {

       Car car1 = new Car();
       car1.model = "Ferrari";
       car1.maxSpeed = 300;

       Car car2 = new Car();
       car2.model = "Ferrari";
       car2.maxSpeed = 300;

       System.out.println(car1 == car2);
   }
}
ڪنسول آئوٽ:

false
اهو لڳي ٿو ته اسان ڪلاس جون ٻه هڪجهڙائي واريون شيون ٺاهي ڇڏيون آهن Car: ٻن مشينن تي سڀئي شعبا ساڳيا آهن، پر مقابلي جو نتيجو اڃا به غلط آهي. اسان اڳ ۾ ئي سبب ڄاڻون ٿا: ڳنڍيون car1۽ car2ميموري ۾ مختلف پتي ڏانهن اشارو، تنهنڪري اهي برابر نه آهن. اسان اڃا تائين ٻن شين جو مقابلو ڪرڻ چاهيون ٿا، نه ٻه حوالا. شين جي مقابلي لاءِ بهترين حل آهي equals().

equals() طريقو

توھان کي ياد ھو سگھي ٿو ته اسان ھي طريقو شروع کان نه ٺاھيو آھي، پر ان کي ختم ڪريون ٿا - آخرڪار، طريقو equals()ڪلاس ۾ بيان ڪيو ويو آھي Object. تنهن هوندي به، ان جي عام صورت ۾ ان کي ٿورو استعمال آهي:
public boolean equals(Object obj) {
   return (this == obj);
}
هن طريقي سان equals()ڪلاس ۾ وضاحت ڪئي وئي آهي Object. لنڪس جو ساڳيو مقابلو. هن کي ائين ڇو بڻايو ويو؟ ڀلا، ٻوليءَ جي تخليق ڪندڙن کي ڪيئن خبر پوندي ته توهان جي پروگرام ۾ ڪهڙيون شيون برابر آهن ۽ ڪهڙيون نه؟ :) اهو طريقو جو بنيادي خيال آهي equals()- طبقي جو خالق پاڻ انهن خاصيتن کي طئي ڪري ٿو جنهن جي ذريعي هن طبقي جي شين جي برابري جي جانچ ڪئي وئي آهي. equals()ائين ڪرڻ سان، توھان پنھنجي ڪلاس ۾ طريقي کي ختم ڪيو . جيڪڏهن توهان بلڪل نه ٿا سمجهو ته "توهان خاصيتون پاڻ کي بيان ڪريو،" اچو ته هڪ مثال ڏسو. هتي هڪ سادي طبقي جو ماڻهو آهي - Man.
public class Man {

   private String noseSize;
   private String eyesColor;
   private String haircut;
   private boolean scars;
   private int dnaCode;

public Man(String noseSize, String eyesColor, String haircut, boolean scars, int dnaCode) {
   this.noseSize = noseSize;
   this.eyesColor = eyesColor;
   this.haircut = haircut;
   this.scars = scars;
   this.dnaCode = dnaCode;
}

   //getters, setters, etc.
}
اچو ته چئو ته اسان هڪ پروگرام لکي رهيا آهيون جنهن کي اهو طئي ڪرڻ جي ضرورت آهي ته ڇا ٻه ماڻهو جڙيل آهن، يا صرف ڊاپيلگنگرز سان لاڳاپيل آهن. اسان وٽ پنج خاصيتون آهن: نڪ جي ماپ، اکين جو رنگ، وارن جو انداز، نشانن جي موجودگي ۽ ڊي اين اي حياتياتي ٽيسٽ جا نتيجا (سادگي لاءِ - ڪوڊ نمبر جي صورت ۾). انهن خاصيتن مان ڪهڙيون خاصيتون توهان سوچيو ٿا ته اسان جي پروگرام کي جڙيل مائٽن جي سڃاڻپ ڪرڻ جي اجازت ڏيندو؟ طريقن جي برابر آهي &  hashCode: استعمال جي مشق - 2يقينا، صرف هڪ حياتياتي امتحان هڪ ضمانت ڏئي سگهي ٿو. ٻن ماڻهن جي اکين جو رنگ، وار، نڪ، ۽ اڃا به نشان ٿي سگهي ٿو - دنيا ۾ ڪيترائي ماڻهو آهن، ۽ اتفاقن کان بچڻ ناممڪن آهي. اسان کي هڪ قابل اعتماد ميڪانيزم جي ضرورت آهي: صرف ڊي اين اي ٽيسٽ جو نتيجو اسان کي صحيح نتيجو ڪڍڻ جي اجازت ڏئي ٿو. اسان جي طريقي لاءِ هي ڇا مطلب آهي equals()؟ اسان کي ضرورت آهي ته ان کي ڪلاس ۾ ٻيهر بيان ڪرڻ Manلاءِ اسان جي پروگرام جي گهرجن کي نظر ۾ رکندي. طريقي کي ٻن شين جي فيلڊ جو مقابلو ڪرڻ گهرجي int dnaCode، ۽ جيڪڏهن اهي برابر آهن، پوء شيون برابر آهن.
@Override
public boolean equals(Object o) {
   Man man = (Man) o;
   return dnaCode == man.dnaCode;
}
ڇا اهو واقعي ايترو سادو آهي؟ سچي نه. اسان ڪجهه وڃايو. انهي صورت ۾، اسان جي شين لاء اسان صرف هڪ "اهم" فيلڊ جي وضاحت ڪئي آهي جنهن جي ذريعي انهن جي برابري قائم ڪئي وئي آهي - dnaCode. هاڻي تصور ڪريو ته اسان وٽ 1 نه، پر 50 اهڙيون ”اهم“ فيلڊون هونديون، ۽ جيڪڏهن ٻن شين جا سڀ 50 شعبا برابر هجن ته پوءِ اهي شيون برابر هونديون. اهو به ٿي سگهي ٿو. بنيادي مسئلو اهو آهي ته 50 شعبن جي برابري جي حساب سان هڪ وقت سازي ۽ وسيلن جي استعمال جو عمل آهي. ھاڻي تصور ڪريو ته ڪلاس کان علاوه، Manاسان وٽ ھڪڙو طبقو آھي Womanجنھن ۾ بلڪل ساڳيا شعبا آھن Man. ۽ جيڪڏهن ٻيو پروگرامر توهان جي ڪلاس کي استعمال ڪري ٿو، هو آساني سان پنهنجي پروگرام ۾ ڪجهه لکي سگهي ٿو جهڙوڪ:
public static void main(String[] args) {

   Man man = new Man(........); //a bunch of parameters in the constructor

   Woman woman = new Woman(.........);//same bunch of parameters.

   System.out.println(man.equals(woman));
}
انهي صورت ۾، فيلڊ جي قيمتن کي جانچڻ جو ڪو به مقصد ناهي: اسان ڏسون ٿا ته اسان ٻن مختلف طبقن جي شين کي ڏسي رهيا آهيون، ۽ اهي اصول ۾ برابر نٿا ٿي سگهن! هن جو مطلب اهو آهي ته اسان کي طريقي ۾ چيڪ ڪرڻ جي ضرورت آهي equals()- ٻن هڪجهڙائي واري طبقن جي شين جو مقابلو. اهو سٺو آهي ته اسان هن بابت سوچيو!
@Override
public boolean equals(Object o) {
   if (getClass() != o.getClass()) return false;
   Man man = (Man) o;
   return dnaCode == man.dnaCode;
}
پر شايد اسان کي ٻيو ڪجهه وساريو؟ هيم... گهٽ ۾ گهٽ، اسان کي جانچڻ گهرجي ته اسان اعتراض کي پاڻ سان ڀيٽ نه ڪري رهيا آهيون! جيڪڏهن حوالا A ۽ B ميموري ۾ ساڳئي ايڊريس ڏانهن اشارو ڪن ٿا، ته اهي ساڳيا اعتراض آهن، ۽ اسان کي 50 شعبن جي مقابلي ۾ وقت ضايع ڪرڻ جي ضرورت ناهي.
@Override
public boolean equals(Object o) {
   if (this == o) return true;
   if (getClass() != o.getClass()) return false;
   Man man = (Man) o;
   return dnaCode == man.dnaCode;
}
ان کان علاوه، ان لاءِ چيڪ شامل ڪرڻ ۾ ڪو به نقصان نه ٿيندو null: ڪو به اعتراض برابر نه ٿي سگھي null، ان صورت ۾ اضافي چيڪن ۾ ڪو به نقطو نه آھي. انهن سڀني ڳالهين کي مدنظر رکندي، اسان جو equals()ڪلاس جو طريقو Manهن طرح نظر ايندو:
@Override
public boolean equals(Object o) {
   if (this == o) return true;
   if (o == null || getClass() != o.getClass()) return false;
   Man man = (Man) o;
   return dnaCode == man.dnaCode;
}
اسان مٿي ذڪر ڪيل سڀني ابتدائي چيڪن کي انجام ڏيون ٿا. جيڪڏهن اهو ظاهر ٿئي ٿو ته:
  • اسان هڪ ئي طبقي جي ٻن شين جو مقابلو ڪريون ٿا
  • هي ساڳيو اعتراض نه آهي
  • اسان پنهنجي اعتراض جي مقابلي ۾ نه آهيونnull
... ان کان پوء اسان اهم خاصيتن جي مقابلي ڏانهن وڃو. dnaCodeاسان جي حالت ۾، ٻن شين جا شعبا . جڏهن هڪ طريقي کي ختم ڪيو وڃي equals()، انهن گهرجن سان عمل ڪرڻ جي پڪ ڪريو:
  1. موٽڻ.

    equals()هر شئي پاڻ وٽ هجڻ گهرجي .
    اسان اڳ ۾ ئي هن ضرورت کي حساب ۾ ورتو آهي. اسان جو طريقو ٻڌائي ٿو:

    if (this == o) return true;

  2. سميٽري.

    جيڪڏهن a.equals(b) == true، پوء b.equals(a)ان کي واپس ڪرڻ گهرجي true.
    اسان جو طريقو پڻ هن ضرورت کي پورو ڪري ٿو.

  3. منتقلي.

    جيڪڏهن ٻه شيون ڪنهن ٽئين شئي جي برابر آهن، ته اهي هڪ ٻئي جي برابر هجڻ گهرجن.
    جيڪڏهن a.equals(b) == true۽ a.equals(c) == true، پوء چيڪ کي b.equals(c)به صحيح موٽڻ گهرجي.

  4. مستقل مزاجي.

    ڪم جا نتيجا equals()تڏهن ئي تبديل ٿيڻ گهرجن جڏهن ان ۾ شامل شعبا تبديل ٿين. جيڪڏهن ٻن شين جي ڊيٽا تبديل نه ڪئي وئي آهي، چيڪ جا نتيجا equals()هميشه ساڳيو هجڻ گهرجي.

  5. عدم مساوات سان null.

    ڪنهن به اعتراض لاءِ، چيڪ کي a.equals(null)غلط موٽڻ گهرجي
    هي صرف ڪجهه ”مفيد سفارشن“ جو هڪ سيٽ ناهي، پر Oracle دستاويزن ۾ ڏنل طريقن جو هڪ سخت معاهدو آهي.

hashCode() طريقو

هاڻي اچو ته طريقي جي باري ۾ ڳالهايون hashCode(). ان جي ضرورت ڇو آهي؟ بلڪل ساڳي مقصد لاءِ - شين جي مقابلي ڪرڻ. پر اسان وٽ اڳ ۾ ئي آهي equals()! ٻيو طريقو ڇو؟ جواب سادو آهي: پيداوار کي بهتر ڪرڻ لاء. هڪ هيش فنڪشن، جنهن جي نمائندگي ڪئي وئي آهي , جاوا ۾ طريقه hashCode()، ڪنهن به اعتراض لاء هڪ مقرر-ڊگھائي عددي قيمت واپس آڻيندي. جاوا جي صورت ۾، طريقو hashCode()32-bit نمبر قسم جو واپسي ٿو int. ٻن انگن جو هڪ ٻئي سان مقابلو ڪرڻ طريقو استعمال ڪندي ٻن شين جي مقابلي ڪرڻ کان گهڻو تيز آهي equals()، خاص طور تي جيڪڏهن اهو ڪيترن ئي شعبن کي استعمال ڪري ٿو. جيڪڏهن اسان جو پروگرام شين جو مقابلو ڪندو، هيش ڪوڊ سان اهو ڪرڻ تمام آسان آهي، ۽ صرف ان صورت ۾ جيڪڏهن اهي برابر هجن hashCode()- مقابلي لاءِ اڳتي equals(). اهو آهي، طريقي سان، هيش تي ٻڌل ڊيٽا ڍانچو ڪيئن ڪم ڪندو آهي- مثال طور، جنهن کي توهان ڄاڻو ٿا HashMap! طريقو hashCode()، جهڙوڪ equals()، ڊولپر پاران پاڻ کي ختم ڪيو ويو آهي. ۽ جيئن ته جيئن equals()، طريقي سان hashCode()سرڪاري گهرجون بيان ڪيون ويون آهن Oracle دستاويزن ۾:
  1. جيڪڏهن ٻه شيون برابر آهن (يعني اهو طريقو equals()صحيح آهي)، انهن وٽ ساڳيو هيش ڪوڊ هجڻ گهرجي.

    ٻي صورت ۾ اسان جا طريقا بي معني ٿي ويندا. چڪاس ڪندي hashCode()، جيئن اسان چيو، ڪارڪردگي کي بهتر ڪرڻ لاء پهريون اچڻ گهرجي. جيڪڏهن هيش ڪوڊ مختلف آهن، چيڪ غلط موٽندا، جيتوڻيڪ شيون اصل ۾ برابر آهن (جيئن اسان طريقي سان بيان ڪيو ويو آهي equals()).

  2. جيڪڏهن هڪ طريقو hashCode()هڪ ئي اعتراض تي ڪيترائي ڀيرا سڏيو وڃي ٿو، اهو هر وقت ساڳيو نمبر واپس ڪرڻ گهرجي.

  3. ضابطو 1 ريورس ۾ ڪم نٿو ڪري. ٻه مختلف شيون ساڳيا هيش ڪوڊ رکي سگھن ٿيون.

ٽيون قاعدو ٿورڙو مونجهارو آهي. اهو ڪيئن ٿي سگهي ٿو؟ وضاحت بلڪل سادو آهي. طريقو hashCode()واپس اچي ٿو int. intهڪ 32-bit نمبر آهي. ان ۾ قدرن جو هڪ محدود تعداد آهي - -2,147,483,648 کان +2,147,483,647 تائين. ٻين لفظن ۾، تعداد جي صرف 4 ارب کان مٿي مختلف تبديليون آهن int. ھاڻي تصور ڪريو ته توھان ھڪڙو پروگرام ٺاھي رھيا آھيو ڌرتيءَ تي سڀني جاندارن بابت ڊيٽا کي ذخيرو ڪرڻ لاءِ. هر ماڻهوءَ جو پنهنجو طبقاتي اعتراض هوندو Man. ~ 7.5 بلين ماڻهو زمين تي رهن ٿا. ٻين لفظن ۾، ڪيترو به سٺو الورورٿم نه هجي Manاسان شين کي انگن ۾ تبديل ڪرڻ لاءِ لکون، اسان وٽ ڪافي تعداد نه هوندا. اسان وٽ صرف 4.5 بلين اختيار آهن، ۽ ٻيا ڪيترائي ماڻهو. هن جو مطلب اهو آهي ته اسان ڪيتري به ڪوشش ڪندا آهيون، هيش ڪوڊس ساڳيا هوندا ڪجهه مختلف ماڻهن لاءِ. اها صورتحال (ٻن مختلف شين جا هيش ڪوڊ ملائيندڙ) کي ٽڪراءُ چئبو آهي. پروگرامر جي مقصدن مان هڪ آهي جڏهن هڪ طريقي کي ختم ڪري رهيو hashCode()آهي ته ممڪن طور تي ممڪن طور تي ٽڪر جي امڪاني تعداد کي گھٽائڻ. انهن سڀني قاعدن کي مدنظر رکندي اسان جي hashCode()ڪلاس لاءِ طريقو ڪهڙو هوندو ؟ Manهن وانگر:
@Override
public int hashCode() {
   return dnaCode;
}
حيران ٿي ويا؟ :) اڻڄاتل طور تي، پر جيڪڏهن توهان ضرورتن تي نظر رکون ٿا، توهان ڏسندا ته اسان هر شي جي تعميل ڪندا آهيون. اهي شيون جن لاءِ اسان جي equals()واپسي صحيح ٿيندي ان ۾ برابر هوندي hashCode(). جيڪڏهن اسان جون ٻه شيون Manقيمت ۾ برابر آهن equals(يعني، انهن جي قيمت ساڳي آهي dnaCode)، اسان جو طريقو ساڳيو نمبر واپس آڻيندو. اچو ته هڪ وڌيڪ پيچيده مثال ڏسو. اچو ته اسان جي پروگرام کي ڪليڪٽر ڪلائنٽ لاء لگزري ڪارون چونڊڻ گهرجي. گڏ ڪرڻ هڪ پيچيده شيء آهي، ۽ ان ۾ ڪيتريون ئي خاصيتون آهن. 1963 کان هڪ ڪار 1964 جي ساڳئي ڪار کان 100 ڀيرا وڌيڪ خرچ ڪري سگهي ٿي. 1970 کان هڪ ڳاڙهي ڪار ساڳئي سال جي هڪ نيري ڪار جي ڀيٽ ۾ 100 ڀيرا وڌيڪ خرچ ڪري سگهي ٿي. طريقن جي برابر آهي &  hashCode: استعمال جي مشق - 4پهرين صورت ۾، ڪلاس سان Man، اسان اڪثر شعبن کي رد ڪري ڇڏيو (يعني، فرد جي خاصيتن) کي غير اهم سمجهي ۽ مقابلي لاءِ صرف فيلڊ استعمال ڪيو dnaCode. هتي اسان هڪ تمام منفرد علائقي سان ڪم ڪري رهيا آهيون، ۽ اتي معمولي تفصيل نه ٿي سگهي! هتي اسان جو ڪلاس آهي LuxuryAuto:
public class LuxuryAuto {

   private String model;
   private int manufactureYear;
   private int dollarPrice;

   public LuxuryAuto(String model, int manufactureYear, int dollarPrice) {
       this.model = model;
       this.manufactureYear = manufactureYear;
       this.dollarPrice = dollarPrice;
   }

   //... getters, setters, etc.
}
هتي، مقابلو ڪرڻ وقت، اسان کي سڀني شعبن کي حساب ۾ رکڻ گهرجي. ڪا به غلطي ڪلائنٽ لاءِ سوين هزارين ڊالر خرچ ڪري سگهي ٿي، تنهنڪري اهو بهتر آهي ته محفوظ رهي:
@Override
public boolean equals(Object o) {
   if (this == o) return true;
   if (o == null || getClass() != o.getClass()) return false;

   LuxuryAuto that = (LuxuryAuto) o;

   if (manufactureYear != that.manufactureYear) return false;
   if (dollarPrice != that.dollarPrice) return false;
   return model.equals(that.model);
}
اسان جي طريقي ۾، equals()اسان سڀني چيڪن جي باري ۾ نه وساريو جيڪي اسان اڳ ۾ ڳالهايون ٿا. پر هاڻي اسان اسان جي شين جي ٽنهي شعبن مان هر هڪ جو مقابلو ڪريون ٿا. هن پروگرام ۾، برابري مطلق هجڻ گهرجي، هر شعبي ۾. ڇا جي باري ۾ hashCode؟
@Override
public int hashCode() {
   int result = model == null ? 0 : model.hashCode();
   result = result + manufactureYear;
   result = result + dollarPrice;
   return result;
}
اسان جي ڪلاس ۾ فيلڊ modelهڪ تار آهي. اهو آسان آهي: Stringطريقو hashCode()اڳ ۾ ئي ڪلاس ۾ ختم ٿي چڪو آهي. اسان فيلڊ جي هيش ڪوڊ کي ڳڻيو ٿا model، ۽ ان ۾ اسان ٻين ٻن عددي شعبن جو مجموعو شامل ڪندا آهيون. جاوا ۾ ھڪڙو ننڍڙو چال آھي جيڪو ٽڪرن جي تعداد کي گھٽائڻ لاءِ استعمال ڪيو ويندو آھي: جڏھن ھيش ڪوڊ کي ڳڻيو وڃي، وچولي نتيجن کي ھڪڙي بي مثال نمبر سان ضرب ڪريو. سڀ کان عام استعمال ٿيل نمبر 29 يا 31 آهي. اسان في الحال رياضي جي تفصيل ۾ نه وينداسين، پر مستقبل جي حوالي سان، ياد رکو ته وچولي نتيجن کي هڪ وڏي ڪافي بي جوڙ نمبر سان ضرب ڪرڻ سان هيش جي نتيجن کي "پکڙجڻ" ۾ مدد ملندي آهي. فنڪشن ۽ ساڳئي هيش ڪوڊ سان گهٽ شين سان ختم ڪريو. LuxuryAuto ۾ اسان جي طريقي لاءِ hashCode()اھو ھن طرح نظر ايندو:
@Override
public int hashCode() {
   int result = model == null ? 0 : model.hashCode();
   result = 31 * result + manufactureYear;
   result = 31 * result + dollarPrice;
   return result;
}
توهان هن پوسٽ ۾ هن ميڪانيزم جي سڀني پيچيدگين بابت وڌيڪ پڙهي سگهو ٿا StackOverflow تي ، انهي سان گڏ جوشوا بلوچ جي ڪتاب ۾ " مؤثر جاوا ". آخر ۾، هڪ وڌيڪ اهم نقطو قابل ذڪر آهي. هر دفعي جڏهن اووررائڊ ڪيو equals()، hashCode()اسان اعتراض جا ڪجهه شعبا چونڊيا، جن کي انهن طريقن ۾ حساب ۾ ورتو ويو. پر ڇا اسان حساب ۾ مختلف شعبن ۾ وٺي سگهون ٿا equals()۽ hashCode()؟ ٽيڪنيڪل طور تي، اسان ڪري سگهون ٿا. پر اھو ھڪڙو خراب خيال آھي، ۽ ھتي آھي ڇو:
@Override
public boolean equals(Object o) {
   if (this == o) return true;
   if (o == null || getClass() != o.getClass()) return false;

   LuxuryAuto that = (LuxuryAuto) o;

   if (manufactureYear != that.manufactureYear) return false;
   return dollarPrice == that.dollarPrice;
}

@Override
public int hashCode() {
   int result = model == null ? 0 : model.hashCode();
   result = 31 * result + manufactureYear;
   result = 31 * result + dollarPrice;
   return result;
}
هتي آهن اسان جا طريقا LuxuryAuto ڪلاس equals()لاءِ . hashCode()طريقو hashCode()تبديل نه ٿيو، ۽ equals()اسان فيلڊ کي هٽائي ڇڏيو model. ھاڻي ماڊل ٻن شين جي ڀيٽ ڪرڻ جي خصوصيت نه آھي equals(). پر اهو اڃا به حساب ۾ ورتو وڃي ٿو جڏهن هيش ڪوڊ جي حساب سان. ان جي نتيجي ۾ اسان کي ڇا حاصل ٿيندو؟ اچو ته ٻه ڪارٽون ٺاهي ۽ ان کي چيڪ ڪريو!
public class Main {

   public static void main(String[] args) {

       LuxuryAuto ferrariGTO = new LuxuryAuto("Ferrari 250 GTO", 1963, 70000000);
       LuxuryAuto ferrariSpider = new LuxuryAuto("Ferrari 335 S Spider Scaglietti", 1963, 70000000);

       System.out.println("Are these two objects equal to each other?");
       System.out.println(ferrariGTO.equals(ferrariSpider));

       System.out.println("What are their hash codes?");
       System.out.println(ferrariGTO.hashCode());
       System.out.println(ferrariSpider.hashCode());
   }
}

Эти два an object равны друг другу?
true
Какие у них хэш-codeы?
-1372326051
1668702472
غلطي! لاءِ مختلف شعبا استعمال ڪندي equals()۽ hashCode()اسان انهن لاءِ قائم ڪيل معاهدي جي ڀڃڪڙي ڪئي! ٻه برابر equals()شيون ساڳيون هيش ڪوڊ هجڻ گهرجن. اسان انهن لاء مختلف معني حاصل ڪئي. اهڙيون غلطيون سڀ کان وڌيڪ ناقابل اعتماد نتيجا آڻي سگهن ٿيون، خاص طور تي جڏهن گڏ ڪرڻ سان ڪم ڪري رهيا آهن جيڪي هيش استعمال ڪندا آهن. تنهن ڪري، جڏهن ٻيهر بيان ڪيو وڃي equals()۽ hashCode()اهو ساڳيو شعبن کي استعمال ڪرڻ صحيح ٿيندو. ليڪچر ته ڪافي ڊگهو ٿي ويو، پر اڄ توهان ڪيتريون ئي نيون شيون سکي ورتيون! :) اهو مسئلو حل ڪرڻ لاء واپس حاصل ڪرڻ جو وقت آهي!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION