خاکہ 1۔ "ایک بظاہر آسان طریقہ"
لکھیں کہ آپ ایک ایسا طریقہ کیسے نافذ کریں گے جو تعداد کو ب کے حساب سے تقسیم کرنے کا نتیجہ واپس کرتا ہے۔ انٹرویو لینے والا کاغذ کے ٹکڑے پر لکھتا ہے۔int divide(int a, int b) {
}
*میں نے طریقہ کے دستخط کے ساتھ کاغذ کے ٹکڑے کی طرف حیرت سے دیکھا۔ کیچ کیا ہے؟* میں لکھتا ہوں:
int divide(int a, int b) {
return a/b;
}
کیا اس طریقہ کار کے ساتھ کوئی مسئلہ ہے؟ *میں واقعی ایک احمق ڈمباس کو پکڑ رہا ہوں* بظاہر نہیں.. اگلا ایک جائز سوال آتا ہے: کیا ہوگا اگر 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
غلطی کی صورت میں کس قسم کا نتیجہ واپس کیا جائے۔ اور کالنگ کے طریقہ کار میں، میں دلیل b کا استعمال کروں گا کہ آیا یہ صفر کے برابر ہے۔ ایسا لگتا ہے کہ اس جواب نے انٹرویو لینے والے کو مطمئن کیا، لیکن سچ پوچھیں تو مجھے یقین نہیں ہے کہ یہ جواب غیر واضح ہے))
خاکہ 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 کو لنکڈ لسٹ میں ایک نئے نوڈ کے طور پر رکھا جائے گا۔نتیجہ کیا ہے؟ کیا کسی شے میں کلید کے بطور
HashMap
نان اوور رائیڈڈ استعمال کرنا ممکن ہےequalshashcode
؟نہیں تم نہیں کر سکتے.
خاکہ 4۔ "آئیے اسے جان بوجھ کر توڑ دیں!"
Error اور Exception کے بارے میں سوالات کے بعد، مندرجہ ذیل سوال آیا: ایک سادہ سی مثال لکھیں جہاں ایک فنکشن StackOverflow پھینک دے گا۔ *پھر مجھے یاد آیا کہ جب میں کچھ ریکسریو فنکشن لکھنے کی کوشش کر رہا تھا تو اس ایرر نے مجھے کس طرح دوچار کیا* یہ شاید ریکسریو کال کی صورت میں ہو گا، اگر ریکسری سے باہر نکلنے کی شرط غلط طریقے سے بیان کی گئی ہو۔ *پھر میں تھوڑا ہوشیار ہونے لگا، آخر میں انٹرویو لینے والے نے مدد کی، سب کچھ آسان نکلا*void sof() {
sof();
}
یہ غلطی اس سے کیسے مختلف ہے OutOfMemory
؟ *میں نے یہاں جواب نہیں دیا، بعد میں میں نے محسوس کیا کہ یہ جاوا میموری Stack
کے علم کے بارے میں ایک سوال ہے Heap
(آجیکٹس کی کالز اور حوالہ جات اسٹیک میں محفوظ ہیں، اور اشیاء خود ہیپ میموری میں محفوظ ہیں)۔ Stack
اس کے مطابق، اسٹیک اوور فلو کو اس وقت باہر پھینک دیا جاتا ہے جب اگلے میتھڈ کال کے لیے میموری میں مزید جگہ نہیں ہوتی ہے ، اور میموری OutOfMemory
میں اشیاء کے لیے جگہ ختم ہوجاتی ہے *Heap
یہ انٹرویو کے وہ لمحات ہیں جو مجھے یاد ہیں۔ آخر میں، مجھے انٹرن شپ کے لیے قبول کر لیا گیا، اس لیے میرے پاس 2.5 ماہ کی تربیت ہے اور، اگر سب کچھ ٹھیک رہا تو، کمپنی میں نوکری) اگر دلچسپی ہو، تو میں ایک اور مضمون لکھ سکتا ہوں، اس بار چھوٹا، اس کے ساتھ ایک سادہ لیکن مثالی مسئلہ کا تجزیہ جو مجھے کسی اور کمپنی میں انٹرویو دیا گیا تھا۔ یہ سب میرے لیے ہے، مجھے امید ہے کہ یہ مضمون کسی کو اپنے علم کو گہرا کرنے یا منظم کرنے میں مدد کرے گا۔ سب کو سیکھنا مبارک ہو!
GO TO FULL VERSION