خاڪو 1. ”هڪ بظاهر سادو طريقو“
لکو ته توهان هڪ طريقو ڪيئن لاڳو ڪندا، جيڪو نمبر a کي ورهائڻ جي نتيجي ۾ واپس اچي ٿو b. انٽرويو وٺندڙ ڪاغذ جي هڪ ٽڪري تي لکي ٿوint divide(int a, int b) {
}
*مون طريقي جي دستخط سان ڪاغذ جي ٽڪري تي ناقابل اعتبار نظر ڪئي. پڪڙي ڇا آهي؟* مان لکان ٿو:
int divide(int a, int b) {
return a/b;
}
ڇا هن طريقي سان ڪي مسئلا آهن؟ *مان هڪ واقعي بيوقوف بيوقوف کي پڪڙي رهيو آهيان* ظاهري طور تي نه .. اڳتي هڪ جائز سوال اچي ٿو: ڇا جيڪڏهن ب = 0؟ *ها، جيڪڏهن مان ائين ئي جاري رهيس ته مون کي هن آفيس مان ڪڍيو ويندو!* ها، يقيناً. هتي اسان وٽ int قسم جا دليل آهن، تنهنڪري هڪ رياضي استثنا اڇلايو ويندو. جيڪڏهن دليلن جا قسم فلوٽ يا ڊبل هئا، نتيجو انفینٽي هوندو. اسان ان بابت ڇا ڪرڻ وارا آهيون؟ مان لکڻ شروع ڪري رهيو آهيان ڪوشش/پڪڙ
int divide(int a, int b) {
try {
return a/b;
} catch (Exception e) {
e.printStackTrace();
return ... // ??? what the hack?
}
}
*مان موٽڻ ۽ منجمد ڪرڻ لاءِ وڃان ٿو: غلطي جي صورت ۾ ڪجهه واپس ڪرڻ جي ضرورت آهي. پر ان ”ڪجهه“ کي حساب جي نتيجي کان ڪيئن ڌار ڪري سگهجي ٿو؟* اسان ڇا واپس ڪنداسين؟ Hm... مان ريٽرن ويريئبل جي قسم کي Integer ۾ تبديل ڪندس ۽ استثنا جي صورت ۾ مان null واپس ڪندس. اچو ته تصور ڪريون ته اسان قسم کي تبديل نٿا ڪري سگھون. ڇا اسان ڪنهن به طرح ٻاهر نڪري سگهون ٿا؟ ٿي سگهي ٿو اسان استثنا سان ٻيو ڪجهه ڪري سگهون ٿا؟ *هتي اهو اچي ٿو* اسان ان کي ڪالنگ جي طريقي ڏانهن پڻ اڳتي وڌائي سگهون ٿا! ساڄو. اهو ڪهڙو نظر ايندو؟
int divide(int a, int b) throws ArithmeticException{
return a/b;
}
void callDivide(int a, int b) {
try {
divide(a, b);
} catch (ArithmeticException e) {
e.printStackTrace();
}
}
ڇا اهو ضروري آهي ته استثنا کي سنڀالڻ لاء؟ ها، ڇاڪاڻ ته اسان واضح طور تي ان کي تقسيم جي طريقي کان اڳتي وڌايو. (*مان هتي غلط هئس! صحيح جواب تي پهچڻ لاءِ انٽرويو وٺندڙ کان هيٺيان سوال پڇيا ويندا آهن*) ۽ رياضي وارو استثنا - اهو ڪهڙي قسم جو استثنا آهي - چيڪ ٿيل يا اڻ چيڪ ٿيل؟ هي هڪ رن ٽائيم استثنا آهي، جنهن جو مطلب آهي اڻ چيڪ ٿيل. *هتي اچي ٿو قاتل سوال* پوءِ اهو ظاهر ٿيو ته، توهان جي لفظن ۾، جيڪڏهن اسان ميٿڊ دستخط ۾ ارٿميٽڪ استثنيٰ اڇلائي، ته پوءِ اهو چيڪ ٿيل استثنا بڻجي ويو؟ *او!* شايد... نه. هو هليو ويو. جيڪڏهن اسان اشارو ڪريون ٿا اڇلائي / اڻ چيڪ ٿيل استثنا / دستخط ۾، اسان صرف ڊيڄاريون ٿا ته طريقو هڪ استثنا اڇلائي سگهي ٿو، پر اهو ضروري ناهي ته ان کي ڪالنگ جي طريقي سان سنڀالڻ لاء. اهو ترتيب ڏنل آهي. ڇا اسان غلطين کان بچڻ لاءِ ٻيو ڪجھ ڪري سگھون ٿا؟ *ڪجهه سوچڻ کان پوءِ* ها، اسان به چيڪ ڪري سگهون ٿا ته (b==0). ۽ ڪجهه منطق انجام ڏيو. ساڄو. تنهنڪري اسان 3 طريقن سان وڃي سگهون ٿا:
- ڪوشش ڪرڻ / پڪڙڻ
- اڇلائڻ - ڪالنگ جي طريقي ڏانهن اڳتي وڌڻ
- دليل جي چڪاس
divide
ڪهڙو طريقو توهان کي ترجيح آهي؟ مان چونڊيندس استثنٰي کي ڪال ڪرڻ واري طريقي ڏانهن، ڇو ته... تقسيم جي طريقي ۾ اهو واضح ناهي ته هن استثنا کي ڪيئن پروسيس ڪيو وڃي ۽ int
غلطي جي صورت ۾ ڪهڙي قسم جو نتيجو واپس ڪيو وڃي. ۽ ڪالنگ جي طريقي ۾، مان استعمال ڪندس دليل ب کي چيڪ ڪرڻ لاءِ ته ڇا اهو صفر جي برابر آهي. اهو لڳي ٿو ته اهو جواب انٽرويو وٺندڙ کي مطمئن ڪيو، پر ايماندار ٿيڻ لاء، مون کي پڪ ناهي ته هي جواب غير واضح آهي))
اسڪيچ 2. ”ڪير تيز آهي؟
معياري سوال کان پوء، هڪ ArrayList هڪ LinkedList کان ڪيئن مختلف آهي، هي آيو: ڇا ٿيندو تيزيء سان - هڪ عنصر کي وچ ۾ArrayList
يا وچ ۾ داخل ڪرڻ LinkedList
؟ * هتي مون ٽپو ڏنو، مون کي ياد آيو ته هر جڳهه مون ڪجهه پڙهيو آهي جهڙوڪ " LinkedList
فهرست جي وچ ۾ عناصر داخل ڪرڻ يا ختم ڪرڻ لاء استعمال ڪريو." گهر ۾ مون JavaRush جي ليڪچرن کي به ٻه ڀيرا چيڪ ڪيو، اتي هڪ جملو آهي: “جيڪڏهن توهان هڪ مجموعي جي وچ ۾ ڪيترائي عنصر داخل ڪرڻ (يا حذف) ڪرڻ وارا آهيو، ته پوءِ توهان بهتر استعمال ڪندا LinkedList
. ٻين سڀني حالتن ۾ - ArrayList
". خودڪار طور تي جواب ڏنو ويو * اهو تيز ٿي ويندو LinkedList
. مهرباني ڪري وضاحت ڪريو
- وچ ۾ هڪ عنصر داخل ڪرڻ لاءِ
ArrayList
، اسان لسٽ ۾ عنصر کي مسلسل وقت ۾ ڳوليندا آهيون، ۽ پوءِ لڪير واري وقت ۾، داخل ڪيل عنصر جي ساڄي پاسي عنصرن جي انڊيڪس کي ٻيهر ڳڻپ ڪندا آهيون. - لاءِ
LinkedList
.. اسان پهرين وچ تي لڪير واري وقت ۾ پهچون ٿا ۽ پوءِ مسلسل وقت ۾ هڪ عنصر داخل ڪري، پاڙيسري عناصر لاءِ لنڪ تبديل ڪري رهيا آهيون.
LinkedList
تيز آهي؟ اهو ظاهر ٿئي ٿو ته جڏهن اسان ان کي لسٽ جي پهرين اڌ ۾ داخل ڪيو. مثال طور، جيڪڏھن توھان ان کي شروع ۾ داخل ڪريو ٿا، توھان کي ArrayList
تمام پڇاڙيءَ تائين سڀني اشارن کي ٻيهر ڳڻڻو پوندو، پر توھان کي LinkedList
صرف پھرين عنصر جو حوالو تبديل ڪرڻو پوندو. اخلاقي: لفظي طور تي هر شي تي يقين نه رکو جيڪو لکيو ويو آهي، جيتوڻيڪ جاوا رش ۾!)
اسڪيچ 3. ”اسان برابر ۽ هيش ڪوڊ کانسواءِ ڪٿي هوندا!“
مسواڙ ۽ هيش ڪوڊ بابت ڳالهه ٻولهه تمام ڊگھي هئي - ان کي ڪيئن اوور رائڊ ڪجي، ان ۾ ڪهڙي عمل درآمد ٿئيObject
، هوڊ هيٺ ڇا ٿئي، جڏهن ڪو عنصر داخل ڪيو وڃي HashMap
، وغيره. مان صرف ڪجهه نقطن جو حوالو ڏيندس جيڪي منهنجي خيال ۾ دلچسپ آهن * تصور ڪريو ته اسان هڪ ڪلاس ٺاهيو آهي
public class A {
int id;
public A(int id) {
this.id = id;
}
}
۽ انهن کي ختم نه ڪيو equals
۽ hashcode
. بيان ڪريو ته ڇا ٿيندو جڏهن ڪوڊ تي عمل ڪيو ويندو
A a1 = new A(1);
A a2 = new A(1);
Map<A, String> hash = new HashMap<>();
hash.put(a1, "1");
hash.get(a2);
*اهو سٺو آهي ته انٽرويو کان اڳ مون خاص طور تي ڪجهه ڏينهن گذاريا آهن بنيادي الگورتھم، انهن جي پيچيدگي ۽ ڊيٽا جي جوڙجڪ کي سمجهڻ - ان ۾ تمام گهڻي مدد ڪئي، مهرباني CS50!*
-
ڪلاس A جا ٻه مثال ٺاھيو
-
اسان هڪ خالي نقشو ٺاهيو، جنهن ۾ ڊفالٽ طور 16 ٽوڪريون آهن. ڪنجي ڪلاس A جو هڪ اعتراض آهي، جنهن ۾
equals
۽ طريقا ختم نه ڪيا ويا آهنhashcode
. -
a1
ان کي نقشي ۾ وجھو . هن کي ڪرڻ لاء، اسان پهريون ڀيرو حساب ڪريون هاشa1
.هيش ڇا جي برابر هوندو؟
ميموري ۾ سيل جو پتو ڪلاس مان ھڪڙي طريقي جو عمل آھي
Object
-
هيش جي بنياد تي، اسان ٽوڪري انڊيڪس کي ڳڻيو ٿا.
اسان ان کي ڪيئن حساب ڪري سگهون ٿا؟
*بدقسمتي سان، مون هتي واضح جواب نه ڏنو. توهان وٽ هڪ ڊگهو نمبر آهي - هڪ هيش، ۽ اتي 16 بالٽ آهن - هڪ انڊيڪس کي ڪيئن بيان ڪيو وڃي ته جيئن مختلف هيش سان شيون هڪجهڙائي سان بالڪن ۾ ورهائجن؟ مان تصور ڪري سگهان ٿو ته انڊيڪس هن طرح ڳڻيو ويو آهي:
int index = hash % buckets.length
اڳ ۾ ئي گهر ۾ مون ڏٺو ته اصل عمل ۾ سورس ڪوڊ ٿورو مختلف آهي:
static int indexFor(int h, int length) { return h & (length - 1); }
-
اسان چيڪ ڪريون ٿا ته ڪو ٽڪر نه آهي ۽ A1 داخل ڪريو.
-
اچو ته طريقي سان اڳتي وڌون
get
. مثالن a1 ۽ a2 مختلف هجڻ جي ضمانت ڏني وئي آهيhash
(ميموري ۾ مختلف ايڊريس)، تنهنڪري اسان هن ڪيئي لاء ڪجهه به نه ڳولي سگهنداسينڇا ٿيندو جيڪڏهن اسان ان کي صرف
hashcode
ڪلاس A ۾ ٻيهر بيان ڪريون ۽ هيش ميپ ۾ داخل ڪرڻ جي ڪوشش ڪريون پهرين هڪ جوڙو ڪي A1 سان، ۽ پوءِ a2 سان؟ان کان پوء پهرين اسان کي گهربل ٽوڪري ڳولي ويندي
hashcode
- هي آپريشن صحيح طريقي سان ڪيو ويندو. اڳيون، اچو تهEntry
ڪارٽ سان جڙيل LinkedList ۾ موجود شين جي ذريعي وڃڻ شروع ڪريون ۽ ڪنجي جو مقابلو ڪريونequals
. ڇاڪاڻ تهequals
اوور رائڊ نه ڪيو ويو آهي، پوءِ بنيادي عمل درآمد ڪلاس مان ورتو وڃي ٿوObject
- حوالن سان موازنہ. a1 ۽ a2 مختلف لنڪس هجڻ جي ضمانت آهن، تنهنڪري اسان داخل ٿيل عنصر a1 کي ”مس“ ڪنداسين، ۽ a2 کي نئين نوڊ طور LinkedList ۾ رکيو ويندو.نتيجو ڇا آهي؟ ڇا اهو ممڪن آهي ته ڪنهن شئي ۾ ڪنجي طور استعمال ڪرڻ
HashMap
غير اوور رائڊ سانequalshashcode
؟نه توهان نٿا ڪري سگهو.
خاڪو 4. ”اچو ته ان کي مقصد سان ٽوڙيون!
Error ۽ Exception بابت سوالن کان پوءِ، ھيٺ ڏنل سوال ڪيو ويو: ھڪڙو سادو مثال لکو جتي ڪو فنڪشن اسٽيڪ اوور فلو اڇلائي ڇڏيندو. *پوءِ مون کي ياد آيو ته هن غلطي مون کي ڪيئن تڪليف ڏني جڏهن مان ڪجهه ريٽورسو فنڪشن لکڻ جي ڪوشش ڪري رهيو هوس* اهو شايد ريٽرسي ڪال جي صورت ۾ ٿيندو، جيڪڏهن ريٽرننگ کان نڪرڻ جي شرط غلط طور تي بيان ڪئي وئي آهي. *پوءِ مان ٿورو هوشيار ٿيڻ لڳس، آخر ۾ انٽرويو وٺندڙ مدد ڪئي، سڀ ڪجھ سادو ٿي ويو*void sof() {
sof();
}
هي غلطي ڪيئن مختلف آهي OutOfMemory
؟ * مون هتي جواب نه ڏنو، صرف بعد ۾ مون محسوس ڪيو ته اهو هڪ سوال هو جاوا ميموري Stack
جي ڄاڻ بابت Heap
(آبجڪس جا ڪال ۽ حوالا اسٽيڪ ۾ محفوظ ٿيل آهن، ۽ شيون پاڻ کي Heap ياداشت ۾ محفوظ ٿيل آهن). ان جي مطابق، StackOverflow اڇلايو ويندو آهي جڏهن Stack
ايندڙ طريقي جي ڪال لاء ميموري ۾ وڌيڪ جاء نه هوندي آهي، ۽ ميموري OutOfMemory
۾ شيون جي جاء ختم ٿي وئي آهي *Heap
ان انٽرويو جا اهي لمحا آهن جيڪي مون کي ياد آهن. آخر ۾، مون کي انٽرنيشنل شپ لاءِ قبول ڪيو ويو، تنهنڪري مون وٽ 2.5 مهينن جي تربيت آهي، ۽، جيڪڏهن سڀ ڪجهه ٺيڪ ٿي وڃي، ڪمپني ۾ نوڪري) جيڪڏهن دلچسپي آهي، ته آئون هڪ ٻيو مضمون لکي سگهان ٿو، هن وقت ننڍو، هڪ سادي پر مثالي مسئلي جو تجزيو جيڪو مون کي ڪنهن ٻئي ڪمپني ۾ انٽرويو ڏنو ويو هو. اهو سڀ ڪجهه مون لاءِ آهي، مون کي اميد آهي ته هي مضمون ڪنهن جي مدد ڪندو پنهنجي علم کي گہرا ڪرڻ يا منظم ڪرڻ ۾. هرڪو سکڻ خوش ٿيو!
GO TO FULL VERSION