equals
آهن hashCode
، ۽ اهو مشورو ڏنو ويو آهي ته انهن ٻنهي طريقن کي انهن جي طبقن ۾ مسلسل ختم ڪرڻ لاء. ٿورڙو ننڍڙو نمبر ڄاڻن ٿا ته ائين ڇو آهي ۽ جيڪڏهن هن قاعدي کي ٽوڙيو وڃي ته ڪهڙا افسوسناڪ نتيجا ٿي سگهن ٿا. مان انهن طريقن جي تصور تي غور ڪرڻ جي تجويز پيش ڪريان ٿو، انهن جي مقصد کي ورجائي ٿو ۽ سمجھي ٿو ته اهي ايترو ڳنڍيل آهن. مون هي مضمون لکيو، اڳئين مضمون وانگر لوڊ ڪرڻ جي ڪلاسن بابت، پنهنجي لاءِ، آخرڪار مسئلي جي سڀني تفصيلن کي ظاهر ڪرڻ لاءِ ۽ هاڻي ٽئين پارٽي جي ذريعن ڏانهن واپس نه وڃان. ان ڪري، مون کي تخليقي تنقيد ڪرڻ ۾ خوشي ٿيندي، ڇو ته جيڪڏهن ڪٿي ڪٿي خال آهن، انهن کي ختم ڪرڻ گهرجي. مضمون، افسوس، ڪافي ڊگهو ٿي ويو.
اوور رائڊ قاعدن جي برابر آهي
جاوا ۾ ھڪڙو طريقوequals()
گھربل آھي ان حقيقت جي تصديق يا انڪار ڪرڻ لاءِ ته ھڪ ئي اصل جا ٻه شيون منطقي طور تي برابر آھن . اهو آهي، جڏهن ٻن شين جي مقابلي ۾، پروگرامر کي سمجهڻ جي ضرورت آهي ته ڇا انهن جا اهم شعبا برابر آهن . اهو ضروري ناهي ته سڀئي شعبا هڪجهڙا هجن، ڇاڪاڻ ته طريقو منطقي برابريequals()
جو مطلب آهي . پر ڪڏهن ڪڏهن هن طريقي کي استعمال ڪرڻ جي ڪا خاص ضرورت ناهي. جيئن ته چوندا آهن، هڪ خاص ميکانيزم کي استعمال ڪندي مسئلن کان بچڻ جو آسان طريقو ان کي استعمال ڪرڻ نه آهي. اهو پڻ ياد رکڻ گهرجي ته هڪ دفعو توهان هڪ معاهدو ٽوڙيو ٿا، توهان اهو سمجهڻ جو ڪنٽرول وڃائي ڇڏيو آهي ته ڪيئن ٻيون شيون ۽ اڏاوتون توهان جي اعتراض سان لهه وچڙ ۾ اينديون. ۽ بعد ۾ غلطي جو سبب ڳولڻ تمام ڏکيو ٿيندو. equals
جڏهن هن طريقي کي ختم ڪرڻ لاء نه
- جڏهن ته هڪ طبقي جو هر مثال منفرد آهي. وڏي حد تائين، هي انهن طبقن تي لاڳو ٿئي ٿو جيڪي ڊيٽا سان ڪم ڪرڻ جي بجاءِ مخصوص رويو مهيا ڪن ٿا. جهڙوڪ، مثال طور، طبقي جي طور تي
- جڏهن حقيقت ۾ طبقي کي ان جي مثالن جي برابري جو تعين ڪرڻ جي ضرورت ناهي. مثال طور، هڪ طبقي لاءِ
- جڏهن توهان جنهن ڪلاس ۾ واڌ ڪري رهيا آهيو ان ۾ اڳ ۾ ئي ان جو پنهنجو لاڳو طريقو آهي
equals
۽ هن عمل درآمد جو رويو توهان لاءِ مناسب آهي. مثال طور، طبقن لاء - ۽ آخر ۾، اتي override ڪرڻ جي ڪا به ضرورت نه آهي
equals
جڏهن توهان جي طبقي جو دائرو آهيprivate
ياpackage-private
۽ توهان کي پڪ آهي ته هن طريقو ڪڏهن به نه سڏيو ويندو.
Thread
. انهن لاءِ equals
، طبقي طرفان مهيا ڪيل طريقي تي عمل ڪرڻ Object
ڪافي آهي. ٻيو مثال آهي enum classes ( Enum
).
java.util.Random
ڪنهن به ضرورت نه آهي ته ڪلاس جي مثالن کي هڪ ٻئي سان ڀيٽڻ، اهو طئي ڪرڻ ته ڇا اهي بي ترتيب انگن جي ساڳي ترتيب کي واپس ڪري سگهن ٿا. صرف ان ڪري ته هن طبقي جي فطرت به اهڙي رويي کي ظاهر نٿو ڪري.
Set
، List
, Map
عمل درآمد equals
۾ آهي AbstractSet
، AbstractList
۽ AbstractMap
ترتيب سان.
معاهدو برابر آهي
جڏهن هڪ طريقي کي ختم ڪري،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
.
برابري کي طئي ڪرڻ لاءِ عام الگورتھم
- اعتراض جي حوالن
this
۽ طريقي جي ماپن جي برابري لاء چيڪ ڪريوo
.if (this == o) return true;
- چيڪ ڪريو ته ڇا لنڪ بيان ڪيل آهي
o
، يعني ڇا اهو آهيnull
.
جيڪڏهن مستقبل ۾، جڏهن اعتراض جي قسمن جي مقابلي ۾، آپريٽر استعمال ڪيو ويندوinstanceof
، هن شيء کي ڇڏي سگهجي ٿو، ڇاڪاڻ ته هي پيٽرولرfalse
هن صورت ۾ واپس اچي ٿوnull instanceof Object
. - هڪ آپريٽر يا طريقو
this
استعمال ڪندي اعتراض جي قسمن جو مقابلو ڪريو ، مٿي ڏنل بيان ۽ توهان جي پنهنجي وجدان جي رهنمائي سان.o
instanceof
getClass()
- جيڪڏهن هڪ طريقو
equals
ذيلي ڪلاس ۾ ختم ڪيو ويو آهي، هڪ ڪال ڪرڻ جي پڪ ڪريوsuper.equals(o)
- تبديل ڪريو پيٽرولر جي قسم
o
کي گهربل ڪلاس ۾. - سڀني اهم اعتراض جي شعبن جي مقابلي کي انجام ڏيو:
- ابتدائي قسمن لاء (سواء
float
۽double
)، آپريٽر استعمال ڪندي==
- حوالن جي شعبن لاءِ توھان کي انھن جي طريقي کي سڏڻ جي ضرورت آھي
equals
- arrays لاءِ، توھان استعمال ڪري سگھو ٿا cyclic iteration يا طريقو
Arrays.equals()
- قسمن لاءِ
float
۽double
ان لاءِ ضروري آهي ته لاڳاپيل لفافي طبقن جي مقابلي جا طريقا استعمال ڪنFloat.compare()
۽Double.compare()
- ابتدائي قسمن لاء (سواء
- ۽ آخر ۾، ٽن سوالن جا جواب ڏيو: ڇا لاڳو ٿيل طريقو سميٽرڪ آهي ؟ منتقلي ؟ اتفاق ڪيو ؟ ٻيا ٻه اصول ( اضطراب ۽ يقين ) عام طور تي خودڪار طريقي سان ڪيا ويندا آهن.
HashCode اوور رائڊ ضابطا
هيش هڪ عدد آهي جيڪو ڪنهن شئي مان پيدا ٿئي ٿو جيڪو پنهنجي حالت بيان ڪري ٿو ڪنهن وقت ۾. هي نمبر جاوا ۾ بنيادي طور تي هيش ٽيبل ۾ استعمال ٿيندو آهي جهڙوڪHashMap
. انهي صورت ۾، هڪ اعتراض جي بنياد تي نمبر حاصل ڪرڻ جو هيش فنڪشن لازمي طور تي لاڳو ڪيو وڃي ته جيئن هيش ٽيبل تي عناصر جي نسبتا برابر تقسيم کي يقيني بڻائي سگهجي. ۽ پڻ تصادم جي امڪان کي گھٽائڻ لاءِ جڏهن فنڪشن مختلف ڪنجين لاءِ ساڳيو قدر واپس ڪري ٿو.
معاهدو هيش ڪوڊ
هيش فنڪشن کي لاڳو ڪرڻ لاء، ٻولي جي وضاحت هيٺ ڏنل قاعدن کي بيان ڪري ٿو:- هڪ ئي شئي تي هڪ يا وڌيڪ ڀيرا هڪ طريقي کي ڪال ڪرڻ
hashCode
لازمي طور تي ساڳيو هش ويل واپس ڪرڻ گهرجي، بشرطيڪ ته اعتراض جي فيلڊ ۾ شامل ڪيل قيمت کي تبديل نه ڪيو وڃي. - ٻن شين تي هڪ طريقي کي ڪال ڪرڻ
hashCode
هميشه ساڳئي نمبر کي موٽڻ گهرجي جيڪڏهن شيون برابر آهن (equals
انهن شين تي هڪ طريقو سڏيندو آهي واپسيtrue
). - ٻن غير مساوي شين تي هڪ طريقو سڏڻ
hashCode
لازمي آهي ته مختلف هيش قدر واپس ڪن. جيتوڻيڪ هي گهرج لازمي نه آهي، اهو سمجهڻ گهرجي ته ان جي عمل کي هاش ٽيبل جي ڪارڪردگي تي مثبت اثر ٿيندو.
برابر ۽ hashCode طريقن کي گڏ ڪرڻ گهرجي
مٿي بيان ڪيل معاهدن جي بنياد تي، اهو هيٺ ڏنل آهي ته جڏهن توهان جي ڪوڊ ۾ طريقي کي ختم ڪيو وڃيequals
، توهان کي هميشه طريقي سان ختم ڪرڻ گهرجي hashCode
. جيئن ته حقيقت ۾ هڪ طبقي جا ٻه مثال مختلف آهن ڇاڪاڻ ته اهي مختلف ميموري علائقن ۾ آهن، انهن کي ڪجهه منطقي معيار جي مطابق مقابلو ڪرڻو پوندو. ان جي مطابق، ٻه منطقي طور تي هڪجهڙائي واري شين کي هڪ ئي هش قدر واپس ڪرڻ گهرجي. ڇا ٿيندو جيڪڏهن انهن مان صرف هڪ طريقو ختم ڪيو وڃي؟
-
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));
ظاهر آهي، اعتراض رکيل آهي ۽ اعتراض جي ڳولا ڪئي پئي وڃي ٻه مختلف شيون آهن، جيتوڻيڪ اهي منطقي طور تي برابر آهن. پر، ڇاڪاڻ ته انهن وٽ مختلف هيش قدر آهن ڇو ته اسان معاهدي جي ڀڃڪڙي ڪئي آهي، اسان اهو چئي سگهون ٿا ته اسان هيش ٽيبل جي آنڊن ۾ پنهنجو اعتراض وڃائي ڇڏيو.
-
hashCode
هاequals
نه.ڇا ٿيندو جيڪڏهن اسان طريقي کي ختم ڪريون
hashCode
۽equals
ڪلاس مان طريقي جي عمل کي ورثي ۾ آڻيونObject
. جيئن توهان ڄاڻو ٿا،equals
ڊفالٽ طريقو صرف اشارن سان اشارن جو مقابلو ڪري ٿو، اهو طئي ڪرڻ ته ڇا اهي ساڳيا اعتراض ڏانهن اشارو ڪن ٿا. اچو ته فرض ڪريون تهhashCode
اسان طريقو سڀني ڪينن جي مطابق لکيو آهي، يعني ان کي IDE استعمال ڪندي پيدا ڪيو، ۽ اهو منطقي طور تي هڪجهڙائي واري شين لاءِ ساڳيا هيش ويل واپس ڪندو. ظاهر آهي، ائين ڪرڻ سان اسان اڳ ۾ ئي ٻن شين جي مقابلي لاءِ ڪجهه ميکانيزم جي وضاحت ڪري چڪا آهيون.تنهن ڪري، پوئين پيراگراف مان مثال نظريي ۾ ڪيو وڃي. پر اسان اڃا تائين هيش ٽيبل ۾ اسان جي اعتراض کي ڳولڻ جي قابل نه هوندا. جيتوڻيڪ اسان هن جي ويجهو ٿينداسين، ڇاڪاڻ ته گهٽ ۾ گهٽ اسان کي هڪ هيش ٽيبل جي ٽوڪري ملندي جنهن ۾ اعتراض ڪوڙ هوندو.
هيش ٽيبل ۾ ڪنهن شئي کي ڪاميابيءَ سان ڳولڻ لاءِ، ڪي جي هيش ويلز جي مقابلي ڪرڻ کان علاوه، سرچ ڪيل اعتراض سان ڪي جي منطقي برابري جو تعين پڻ استعمال ڪيو ويندو آهي. اهو آهي،
equals
طريقي کي ختم ڪرڻ کان سواء ڪو به طريقو ناهي.
hashCode کي طئي ڪرڻ لاءِ عام الگورتھم
هتي، اهو مون کي لڳي ٿو، توهان کي تمام گهڻو پريشان نه ڪرڻ گهرجي ۽ پنهنجي پسنديده IDE ۾ طريقو ٺاهيو. ڇاڪاڻ ته اهي سڀئي بٽ ساڄي ۽ کاٻي طرف گولڊن تناسب جي ڳولا ۾، يعني، عام تقسيم - اهو مڪمل طور تي ضدي دوستن لاء آهي. ذاتي طور تي، مون کي شڪ آهي ته مان ساڳئي خيال کان بهتر ۽ تيز ڪري سگهان ٿو.نتيجي جي بدران
اهڙيء طرح، اسان ڏسون ٿا ته طريقا جاوا ٻوليء ۾ هڪ چڱي طرح بيان ڪيل ڪردارequals
ادا ڪن ٿا ۽ ٻن شين جي منطقي مساوات جي خاصيت حاصل ڪرڻ لاء ٺهيل آهن. hashCode
طريقي جي صورت ۾، equals
هن جو هڪ سڌو تعلق آهي شين جي مقابلي سان، hashCode
هڪ اڻ سڌي طرح جي صورت ۾، جڏهن اهو ضروري هجي، اچو ته چئو، هيش ٽيبل يا ساڳي ڊيٽا جي جوڙجڪ ۾ ڪنهن شئي جي تقريبن جڳهه کي طئي ڪرڻ لاء. اعتراض جي ڳولا جي رفتار کي وڌايو. معاهدن کان علاوه ، equals
اتي hashCode
هڪ ٻي گهرج آهي شين جي مقابلي سان لاڳاپيل. هي هڪ compareTo
انٽرفيس جي طريقي جي مطابقت آهي . اها گهرج ڊولپر کي پابند ڪري ٿي ته هميشه واپس اچي جڏهن . اهو آهي، اسان ڏسون ٿا ته ٻن شين جو منطقي مقابلو ايپليڪيشن ۾ ڪٿي به تضاد نه هجڻ گهرجي ۽ هميشه هڪجهڙائي هجڻ گهرجي. Comparable
equals
x.equals(y) == true
x.compareTo(y) == 0
GO TO FULL VERSION