JavaRush /جاوا بلاگ /Random-UR /جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔ حص...

جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔ حصہ 10

گروپ میں شائع ہوا۔
ہیلو! کسی چیز میں ماسٹر بننے میں کتنے گھنٹے لگتے ہیں؟ میں نے اکثر کچھ ایسا سنا ہے: "کسی بھی چیز میں ماسٹر بننے کے لیے، آپ کو 10,000 گھنٹے گزارنے ہوں گے۔" ایک خوفناک نمبر، ہے نا؟ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 10 - 1تاہم، میں حیران ہوں کہ کیا یہ سچ ہے؟ اور میں مسلسل یہ جاننے کی کوشش کر رہا ہوں کہ میں نے پروگرامنگ کے فن میں مہارت حاصل کرنے میں پہلے ہی کتنے گھنٹے لگائے ہیں۔ اور جب میں ان پیارے 10,000 گھنٹے کو عبور کر کے ماسٹر بن جاؤں گا تو کیا میں یہ فرق محسوس کروں گا؟ یا میں سمجھے بغیر ہی ان پر قدم رکھ چکا ہوں؟ کسی نہ کسی طرح، پروگرامر بننے کے لیے، آپ کو اتنا بڑا وقت لگانے کی ضرورت نہیں ہے۔ اہم چیز اسے سمجھداری سے استعمال کرنا ہے۔ آپ کا بنیادی مقصد انٹرویو پاس کرنا ہے۔ اور نئے آنے والوں کے انٹرویوز میں، وہ سب سے پہلی چیز جو پوچھتے ہیں وہ تھیوری ہے، لہذا آپ کو اس میں مضبوط ہونا چاہیے۔ دراصل، انٹرویو کی تیاری کرتے وقت، آپ کا کام یہ ہے کہ جاوا ڈویلپر کی بنیادی تھیوری میں اپنے تمام خلاء کو دریافت کریں اور ان کو علم سے ڈھانپیں۔ اور آج میں اس معاملے میں آپ کی مدد کروں گا، کیونکہ میں یہاں سب سے زیادہ مقبول سوالات کا تجزیہ کرنے کے لیے حاضر ہوں۔ تو آئیے جاری رکھیں!

89. ArrayList LinkedList سے کیسے مختلف ہے؟

HashMap کی اندرونی ساخت کے بارے میں سوال کے ساتھ یہ سب سے زیادہ مقبول سوالات میں سے ایک ہے ۔ اس کے بغیر ایک بھی انٹرویو مکمل نہیں ہوتا، اور اس لیے اس کا جواب "اپنے دانت اچھالنا چاہیے۔" واضح کے علاوہ - مختلف نام - وہ اندرونی ساخت میں مختلف ہیں. اس سے پہلے، ہم نے ArrayList اور LinkedList دونوں کے اندرونی ڈھانچے کا جائزہ لیا تھا ، لہذا میں ان کے نفاذ کی تفصیلات میں نہیں جاؤں گا۔ میں آپ کو صرف یاد دلاتا ہوں کہ ArrayList ایک اندرونی صف کی بنیاد پر لاگو کیا جاتا ہے، جو فارمولے کے مطابق ضرورت کے مطابق بڑھایا جاتا ہے:
<размерТекущегоМассива> * 3 / 2  + 1
ایک ہی وقت میں، LinkedList کو داخلی دوگنا منسلک فہرست کی بنیاد پر لاگو کیا جاتا ہے، یعنی، ہر عنصر کا پچھلے اور اگلے سے ایک لنک ہوتا ہے، ان اقدار کو چھوڑ کر جو فہرست کا آغاز/اختتام ہیں۔ لوگ یہ سوال اس فارمیٹ میں پوچھنا پسند کرتے ہیں: "کون سا بہتر ہے - ArrayList یا LinkedList ؟"، آپ کو پکڑنے کی امید میں۔ سب کے بعد، اگر آپ جواب کے طور پر ان میں سے ایک کی طرف اشارہ کرتے ہیں، تو یہ غلط جواب ہوگا. جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 10 - 2اس کے بجائے، آپ کو واضح کرنا چاہیے کہ آپ کس مخصوص صورتحال کے بارے میں بات کر رہے ہیں - فہرست کے درمیان رسائی یا اندراج۔ جواب پر منحصر ہے، آپ اپنی پسند کی وضاحت کر سکیں گے۔ میں نے پہلے بیان کیا ہے کہ کس طرح ArrayList اور LinkedList کسی نہ کسی صورت حال میں کام کرتے ہیں۔ آئیے موازنہ کے لیے ایک ہی صفحہ پر رکھ کر اس کا خلاصہ کریں: ایک عنصر شامل کرنا (اضافہ کریں)
  1. مقام کے طور پر انڈیکس کی وضاحت کیے بغیر نیا عنصر شامل کرنا دونوں فہرستوں کے آخر میں خود بخود ہو جائے گا۔ لنکڈ لسٹ میں ، نیا عنصر نئی دم بن جائے گا (صرف لنک جوڑے کو دوبارہ لکھنا ہوتا ہے - O(1) الگورتھم پیچیدگی )۔

    В ArrayList будет добавлен новый элемент в последнюю пустую ячейку массива — O(1).

  2. Добавление element по индексу How правило подразумевает вставку примерно в середину списка. В LinkedList сперва будет вестись поиск нужного места с помощью перебора элементов с “хвоста” и “головы” — O(n/2), а после — вставка значения путем переопределения ссылок элементов, между которыми вставляется новый — O(1). Суммарная алгоритмическая сложность данного действия будет O(n/2).

    ArrayList в данной ситуации по индексу находит элемент — O(1), и все элементы справа (включая элемент, который уже хранится по данному индексу) двигаются на одну единицу вправо (при этом возможно понадобится создание нового списка и копирование элементов в него) — O(n/2). Суммарная сложность — O(n/2).

  3. Добавление element в начало списка в LinkedList будет ситуация схожая с добавлением в конец: новый элемент станет новой “головой” — O(1), в то же время когда ArrayList-у нужно будет двигать все элементы вправо — O(n).

نیچے کی سطر: LinkedList میں، الگورتھمک پیچیدگی O(1) سے O(n/2) تک ہوگی ۔ یعنی اندراج فہرست کے اختتام یا آغاز کے جتنا قریب ہوگا، اتنا ہی تیز ہوگا۔ ایک ہی وقت میں، ArrayList کے لیے یہ O(1) سے O(n) تک ہے : اندراج فہرست کے اختتام کے جتنا قریب ہوگا، اتنا ہی تیز ہوگا۔ ایک عنصر کی ترتیب (سیٹ) یہ عمل فہرست میں مخصوص پوزیشن پر ایک عنصر لکھتا ہے، پچھلے والے کو اوور رائٹ کرتا ہے، اگر کوئی ہو۔ LinkedList میں ، یہ آپریشن شامل کرنے کے مترادف ہوگا، کیونکہ یہاں سب سے بڑی مشکل عنصر کو تلاش کرنا ہے۔ ایک عنصر کو دوبارہ لکھنا لنکس کے ایک جوڑے کو دوبارہ لکھنے سے ہوتا ہے، لہذا یہاں بھی الگورتھمک پیچیدگی O(1) سے O(n/2) تک ہوگی جو فہرست کے اختتام یا شروع سے پوزیشن کے فاصلے پر منحصر ہے۔ اس وقت، مطلوبہ سیل اس انڈیکس آپریشن کے لیے ArrayList میں مل جائے گا ، اور اس پر ایک نیا عنصر لکھا جائے گا۔ انڈیکس کی تلاش، اس آپریشن کی طرح، O(1) کی الگورتھمک پیچیدگی رکھتی ہے ۔ ایک عنصر کو انڈیکس کے ذریعہ لیں (حاصل کریں) LinkedList میں ، ایک عنصر لینا اسی اصول کے مطابق ہوگا جیسے دوسرے آپریشنز کی تلاش میں - اختتام یا شروع سے فاصلے پر منحصر ہے، یعنی O(1) سے O(n/2) تک ۔ ArrayList میں ، جیسا کہ میں نے پہلے کہا، انڈیکس کے ذریعہ ایک صف میں عنصر تلاش کرنے میں O(1) پیچیدگی ہے ۔ ایک عنصر کو index کے ذریعے ہٹائیں (remove) LinkedList کے لیے ، اس کے آپریشن کا اصول یہاں بھی کام کرتا ہے: پہلے عنصر پایا جاتا ہے، اور پھر لنکس کو اوور رائٹ کر دیا جاتا ہے - عنصر کے پڑوسی ایک دوسرے کا حوالہ دینا شروع کر دیتے ہیں، اس عنصر کا حوالہ کھو دیتے ہیں، جسے بعد میں کوڑا اٹھانے والے کے ذریعے حذف کر دیا جائے گا۔ یعنی، الگورتھمک پیچیدگی اب بھی وہی ہے - O(1) سے O(n/2) تک ۔ ArrayList کے لیے ، یہ آپریشن ایک نئے عنصر (add) کو شامل کرنے کے آپریشن سے زیادہ ملتا جلتا ہے۔ سب سے پہلے، مطلوبہ عنصر پایا جاتا ہے - O(1) ، پھر اسے ہٹا دیا جاتا ہے، اور وہ تمام عناصر جو اس کے دائیں طرف تھے، ایک یونٹ کو بائیں طرف منتقل کر دیا جاتا ہے تاکہ نتیجے میں پیدا ہونے والے خلا کو ختم کیا جا سکے۔ ڈیلیٹ آپریشن میں وہی الگورتھمک پیچیدگی ہوگی جو ایڈ آپریشن کی ہے - O(1) سے O(n) تک ۔ حذف کرنا فہرست کے اختتام کے جتنا قریب ہوگا، اس کی الگورتھمک پیچیدگی اتنی ہی کم ہوگی۔ درحقیقت یہ سب اہم آپریشن تھے۔ میں آپ کو یاد دلاتا ہوں: ان دو فہرستوں کا موازنہ کرتے وقت، آپ کو یہ واضح کرنے کی ضرورت ہے کہ ہم کس مخصوص صورتحال کے بارے میں بات کر رہے ہیں، اور پھر آپ سوال کا غیر واضح جواب دے سکتے ہیں۔

90. ایک ArrayList ہیش سیٹ سے کیسے مختلف ہے؟

اگر ArrayList اور LinkedList کا موازنہ آپریشنز کے لحاظ سے کیا جا سکتا ہے - جو بہتر ہے - تو پھر ArrayList کا HashSet سے موازنہ کرنا اتنا آسان نہیں ہے ، کیونکہ یہ بالکل مختلف مجموعے ہیں۔ آپ ایک میٹھی ڈش کا دوسری سے موازنہ کر سکتے ہیں، لیکن یہ گوشت کی ڈش کے ساتھ کام کرے گا - وہ بہت مختلف ہیں۔ تاہم، میں ان کے درمیان کچھ اختلافات دینے کی کوشش کروں گا:
  • ArrayList List انٹرفیس کو نافذ کرتا ہے ، جبکہ HashSet Set انٹرفیس کو نافذ کرتا ہے ۔

  • ArrayList میں ، عنصر انڈیکس کے ذریعے رسائی ممکن ہے: get آپریشن میں O(1) کی الگورتھمک پیچیدگی ہے ، اور HashSet میں مطلوبہ عنصر صرف بروٹ فورس کے ذریعے حاصل کیا جا سکتا ہے، اور یہ O(1) سے O(n) تک ہے ۔ ;

  • ArrayList ڈپلیکیٹ عناصر کی اجازت دیتا ہے۔ ہیش سیٹ میں ، تمام عناصر منفرد ہوتے ہیں: ہیش سیٹ میں ایک عنصر شامل کرنا جس کا اینالاگ پہلے سے مجموعہ میں موجود ہے کام نہیں کرے گا (ہیش کوڈ کا استعمال کرتے ہوئے ڈپلیکیٹس کو چیک کیا جاتا ہے، اس لیے اس مجموعہ کا نام)؛

  • ArrayList ایک اندرونی صف کا استعمال کرتے ہوئے لاگو کیا جاتا ہے، اور HashSet کو اندرونی HashMap کا استعمال کرتے ہوئے لاگو کیا جاتا ہے ؛

  • ایک ArrayList عناصر کے اندراج کی ترتیب کو برقرار رکھتی ہے، جبکہ HashSet ایک غیر ترتیب شدہ سیٹ ہے اور عناصر کی ترتیب کو برقرار نہیں رکھتا ہے۔

  • ArrayList کسی بھی تعداد میں خالی اقدار (null) کی اجازت دیتا ہے، HashSet میں صرف ایک null قدر ڈالی جا سکتی ہے (آخر میں عناصر کی انفرادیت)۔

91. جاوا میں اس طرح کے متعدد متحرک صفوں کے نفاذ کیوں ہیں؟

جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 10 - 3ٹھیک ہے، یہ ایک فلسفیانہ سوال ہے. ٹھیک ہے، وہ اتنی مختلف نئی ٹیکنالوجیز کیوں لے کر آتے ہیں؟ آرام کے لیے۔ درحقیقت، یہ بڑی تعداد میں متحرک صفوں کے نفاذ کے ساتھ ایک جیسا ہے۔ ان میں سے کسی کو بھی بہترین یا مثالی نہیں کہا جا سکتا۔ ہر ایک کو کسی مخصوص صورتحال میں فائدہ ہوتا ہے۔ اور ہمارا کام ان کے اختلافات، ان کی خوبیوں/کمزوریوں کو جاننا ہے: تاکہ صحیح صورت حال میں موزوں ترین کو استعمال کر سکیں۔

92. جاوا میں کلیدی قدر ذخیرہ کرنے کے اس طرح کے متعدد نفاذ کیوں ہیں؟

یہاں صورتحال وہی ہے جو متحرک صف کے نفاذ کے ساتھ ہے۔ کوئی بھی بہترین نہیں ہے: ہر ایک کی طاقت اور کمزوریاں ہیں۔ اور ہمیں، یقیناً، اپنی طاقت کا زیادہ سے زیادہ استعمال کرنا چاہیے۔ مثال: کنکرنٹ پیکیج، جس میں بہت سی ملٹی تھریڈ ٹیکنالوجیز ہیں، اس کے اپنے کنکرنٹ کلیکشن ہیں۔ ایک ہی ConcurrentHashMap کو ایک باقاعدہ HashMap کے مقابلے ڈیٹا کے ساتھ ملٹی تھریڈڈ کام کی حفاظت میں ایک فائدہ ہے ، لیکن غیر ملٹی تھریڈ والے ماحول میں اس کی رفتار کم ہوجاتی ہے۔ ٹھیک ہے، نفاذ، جو کسی بھی صورت حال میں سب سے مضبوط نہیں ہیں، آہستہ آہستہ استعمال کرنا بند کر دیا جاتا ہے۔ مثال: ہیش ٹیبل کا اصل مقصد تھریڈ سے محفوظ HashMap ہونا تھا ، لیکن ConcurrentHashMap نے اسے ایک کثیر تھریڈ والے ماحول میں بہتر کارکردگی کا مظاہرہ کیا اور Hashtable کو آخرکار بھول گیا اور اسے مزید استعمال نہیں کیا گیا۔

93. عناصر کا مجموعہ کیسے ترتیب دیا جائے؟

کہنے کی پہلی بات یہ ہے کہ مجموعہ عنصر کلاس کو Comparable انٹرفیس اور اس کے compareTo طریقہ کو لاگو کرنا چاہیے ۔ یا آپ کو ایک ایسی کلاس کی ضرورت ہے جو Comparator کو اس کے comparator طریقہ کے ساتھ نافذ کرے ۔ آپ اس پوسٹ میں ان کے بارے میں مزید پڑھ سکتے ہیں ۔ دونوں طریقے بتاتے ہیں کہ دی گئی قسم کی اشیاء کا موازنہ کیسے کیا جانا چاہیے۔ چھانٹتے وقت، یہ انتہائی اہم ہے، کیونکہ آپ کو اس اصول کو سمجھنے کی ضرورت ہے جس کے ذریعے عناصر کا موازنہ کیا جا سکتا ہے۔ ایسا کرنے کا بنیادی طریقہ یہ ہے کہ Comparable کو لاگو کیا جائے ، براہ راست اس کلاس میں لاگو کیا جائے جسے آپ ترتیب دینا چاہتے ہیں۔ ایک ہی وقت میں، Comparator کا استعمال کم عام ہے۔ ہم کہتے ہیں کہ آپ کسی لائبریری سے ایسی کلاس استعمال کر رہے ہیں جس میں تقابلی نفاذ نہیں ہے ، لیکن آپ کو اسے کسی نہ کسی طرح ترتیب دینے کی ضرورت ہوگی۔ اس کلاس کے کوڈ کو تبدیل کرنے کے قابل ہونے کے بغیر (اس کو بڑھا کر)، آپ Comparator کا نفاذ لکھ سکتے ہیں ، جس میں آپ یہ بتاتے ہیں کہ آپ اس کلاس کی اشیاء کا موازنہ کس اصول پر کرنا چاہتے ہیں۔ اور ایک مثال۔ فرض کریں کہ آپ کو ایک ہی قسم کی اشیاء کو چھانٹنے کے لیے مختلف اصولوں کی ضرورت ہے، اس لیے آپ متعدد Comparators لکھتے ہیں جو آپ مختلف حالات میں استعمال کرتے ہیں۔ ایک اصول کے طور پر، باکس سے باہر بہت سی کلاسیں پہلے ہی تقابلی انٹرفیس کو نافذ کرتی ہیں - وہی String ۔ دراصل، ان کا استعمال کرتے وقت، آپ کو ان کا موازنہ کرنے کے بارے میں فکر کرنے کی ضرورت نہیں ہے۔ آپ صرف انہیں لے لو اور استعمال کریں۔ پہلا اور سب سے واضح طریقہ TreeSet یا TreeMap قسم کا مجموعہ استعمال کرنا ہے ، جو عناصر کو پہلے سے ترتیب شدہ ترتیب میں ایلیمنٹ کلاس کمپیریٹر کے مطابق اسٹور کرتا ہے۔ یاد رکھیں کہ TreeMap کلیدوں کو ترتیب دیتا ہے، لیکن اقدار کو نہیں۔ اگر آپ Comparable کے بجائے Comparator نفاذ کا استعمال کرتے ہیں ، تو آپ کو تخلیق کے بعد اس کا اعتراض کلیکشن کنسٹرکٹر کو دینا ہوگا۔
TreeSet treeSet = new TreeSet(customComparator);
لیکن کیا ہوگا اگر آپ کے پاس مختلف قسم کا مجموعہ ہے؟ اسے کیسے ترتیب دیا جائے؟ اس صورت میں، کلیکشن یوٹیلیٹی کلاس کا دوسرا طریقہ موزوں ہے - sort() طریقہ ۔ یہ جامد ہے، لہذا آپ کو صرف اس کلاس کا نام اور ایک طریقہ کی ضرورت ہے جس میں مطلوبہ فہرست پاس کی جاتی ہے۔ مثال کے طور پر:
Collections.sort(someList);
اگر آپ Comparable استعمال نہیں کر رہے ہیں ، بلکہ Comparator کا نفاذ ہے ، تو آپ کو اسے دوسرے پیرامیٹر کے طور پر پاس کرنے کی ضرورت ہے:
Collections.sort(someList, customComparator);
نتیجے کے طور پر، پاس شدہ فہرست کے عناصر کی اندرونی ترتیب بدل جائے گی: اسے عنصر کے موازنہ کے مطابق ترتیب دیا جائے گا۔ میں نوٹ کرتا ہوں کہ عناصر کی منتقلی کی فہرست متغیر ہونی چاہیے، یعنی mutable، بصورت دیگر یہ طریقہ کام نہیں کرے گا اور ایک UnsupportedOperationException پھینک دیا جائے گا ۔ تیسرے طریقے کے طور پر ، آپ Stream sort آپریشن استعمال کر سکتے ہیں ، جو مجموعہ کے عناصر کو ترتیب دیتا ہے اگر تقابلی نفاذ کا استعمال کیا جاتا ہے :
someList = someList.stream().sorted().collect(Collectors.toList());
اگر موازنہ کرنے والا :
someList = someList.stream().sorted(customComparator).collect(Collectors.toList());
آپ اس مضمون میں اسٹریم کے بارے میں مزید پڑھ سکتے ہیں ۔ چوتھا طریقہ یہ ہے کہ چھانٹی کو دستی طور پر لاگو کیا جائے، جیسے کہ bubble sort یا merge sort ۔

کلاس آبجیکٹ۔ مساوی اور ہیش کوڈ

94. جاوا میں کلاس آبجیکٹ کی مختصر تفصیل دیں۔

تجزیہ کے دوسرے حصے میں، ہم پہلے ہی آبجیکٹ کلاس کے طریقوں کے بارے میں بات کر چکے ہیں ، اور میں آپ کو یاد دلاؤں گا کہ آبجیکٹ کلاس جاوا میں تمام کلاسز کا پروجنیٹر ہے۔ اس کے 11 طریقے ہیں، جو، اس کے مطابق، تمام طبقات کو وراثت میں ملے ہیں۔ تمام 11 طریقوں کے بارے میں معلومات بحث کے دوسرے حصے میںجاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 10 - 4 مل سکتی ہیں ۔

95. جاوا میں Equals اور HashCode کیا استعمال ہوتے ہیں؟

hashCode() آبجیکٹ کلاس کا ایک طریقہ ہے جو تمام کلاسوں کو وراثت میں ملا ہے۔ اس کا کام کچھ عدد پیدا کرنا ہے جو کسی مخصوص شے کی نمائندگی کرتا ہے۔ اس طریقہ کو استعمال کرنے کی ایک مثال مقامی ہیش کوڈ کا مزید تعین کرنے کے لیے کلیدی آبجیکٹ پر HashMap میں اس کا استعمال ہے ، جو اندرونی صف (بالٹی) کے سیل کا تعین کرے گا جس میں جوڑا ذخیرہ کیا جائے گا۔ ہم نے تجزیہ کے حصہ 9 میں HashMap کے کام کے بارے میں تفصیل سے بات کی ، لہذا ہم اس پر زیادہ غور نہیں کریں گے۔ اس کے علاوہ، ایک اصول کے طور پر، یہ طریقہ اشیاء کی شناخت کے تعین کے لیے اس کے اہم ٹولز میں سے ایک کے طور پر equals() طریقہ میں استعمال ہوتا ہے۔ equals() آبجیکٹ کلاس کا ایک طریقہ ہے جس کا کام اشیاء کا موازنہ کرنا اور یہ طے کرنا ہے کہ آیا وہ برابر ہیں یا نہیں۔ یہ طریقہ ہر جگہ استعمال ہوتا ہے جہاں ہمیں اشیاء کا موازنہ کرنے کی ضرورت ہوتی ہے، کیونکہ == کا استعمال کرتے ہوئے معمول کا موازنہ اشیاء کے لیے موزوں نہیں ہے، کیونکہ ان سے صرف لنکس کا موازنہ کرتا ہے۔ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 10 - 5

96. جاوا میں Equals اور HashCode کے درمیان معاہدے کے بارے میں بتائیں؟

پہلی چیز جو میں کہوں گا وہ یہ ہے کہ equals() اور hashCode() طریقوں کو صحیح طریقے سے کام کرنے کے لیے ، انہیں صحیح طریقے سے اوور رائڈ کرنے کی ضرورت ہے۔ اس کے بعد انہیں قواعد پر عمل کرنا ہوگا:
  • ایک جیسی اشیاء جن کے لیے برابری کے ذریعے موازنہ درست واپسی پر ایک جیسے ہیش کوڈز کا ہونا ضروری ہے ۔
  • ایک جیسے ہیش کوڈ والی اشیاء ہمیشہ برابر نہیں ہوسکتی ہیں۔
اس مقام پر ہم تجزیہ کے اگلے حصے تک توقف کریں گے!جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 10 - 6
سیریز میں دیگر مواد:
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION