
89. ایک ArrayList لنکڈ لسٹ سے کیسے مختلف ہے؟
HashMap کی اندرونی ساخت کے بارے میں سوال کے ساتھ یہ سب سے زیادہ مقبول سوالات میں سے ایک ہے ۔ اس کے بغیر کوئی انٹرویو مکمل نہیں ہوتا، اس لیے آپ کا جواب آسانی سے آپ کی زبان سے نکل جانا چاہیے۔ واضح کے علاوہ (ان کے مختلف نام ہیں)، وہ ان کی اندرونی ساخت میں مختلف ہیں. اس سے پہلے، ہم نے ArrayList اور LinkedList دونوں کے اندرونی ڈھانچے پر تبادلہ خیال کیا ، لہذا میں ان کے نفاذ کی تفصیلات میں غوطہ نہیں لگاؤں گا۔ میں صرف آپ کو یاد دلاؤں گا کہ ArrayList ایک اندرونی صف کا استعمال کرتے ہوئے لاگو کیا جاتا ہے جس کا سائز اس فارمولے کے مطابق متحرک طور پر بڑھتا ہے:<size of the current array> * 3 / 2 + 1
مزید برآں، ایک LinkedList کے نفاذ میں ایک اندرونی دوگنا منسلک فہرست کا استعمال کیا جاتا ہے، یعنی، ہر عنصر میں پچھلے اور اگلے عناصر کا حوالہ ہوتا ہے، سوائے فہرست کے شروع اور آخر میں موجود عناصر کے۔ انٹرویو لینے والے یہ سوال اس طرح پوچھنا پسند کرتے ہیں، "کون سا بہتر ہے، ArrayList یا LinkedList ؟" آپ کو پکڑنے کی امید ہے. سب کے بعد، اگر آپ کہتے ہیں کہ ایک یا دوسرا بہتر ہے، تو آپ نے غلط جواب دیا ہے. 
-
اگر کسی اشاریہ کی وضاحت نہیں کی گئی ہے، تو دونوں قسم کی فہرستوں کے لیے ایک نیا آئٹم خود بخود آخر میں شامل ہو جائے گا۔ LinkedList میں ، نیا عنصر نئی دم بن جائے گا (صرف حوالہ جات کا ایک جوڑا دوبارہ لکھا جائے گا، لہذا الگورتھمک پیچیدگی O(1) ہے )۔
شامل کرنے کا طریقہ سرنی ( O(1) ) میں آخری خالی سیل میں ایک عنصر کا اضافہ کرتا ہے۔
-
انڈیکس کے ذریعہ کسی آئٹم کو شامل کرنے کا مطلب عام طور پر اسے فہرست کے بیچ میں کہیں داخل کرنا ہوتا ہے۔ لنکڈ لسٹ میں ، طریقہ پہلے ٹیل اور ہیڈ ( O(n/2) ) سے عناصر کو دہراتے ہوئے مطلوبہ مقام کی تلاش کرے گا اور پھر دونوں طرف عناصر کے حوالہ جات کو اوور رائٹ کرکے ویلیو داخل کرے گا جہاں نیا عنصر داخل کیا گیا ہے ( O(1) )۔ اس آپریشن کی مجموعی الگورتھمک پیچیدگی O(n/2) ہوگی ۔
اسی صورت حال میں (انڈیکس کے ذریعے شامل کرنا)، ایک ArrayList مطلوبہ مقام ( O(1) ) تلاش کرتی ہے اور پھر دائیں جانب واقع تمام عناصر کو (بشمول مخصوص انڈیکس میں پہلے سے ذخیرہ شدہ عنصر) کو ایک ایک کرکے دائیں جانب شفٹ کر دیتی ہے۔ ایک نئی داخلی صف کی تخلیق اور اس میں عناصر کاپی کرنے کی ضرورت ہو سکتی ہے) ( O(n/2) )۔ مجموعی پیچیدگی O(n/2) ہے ۔
-
LinkedList کے آغاز میں کسی عنصر کو شامل کرنا آخر میں ایک عنصر کو شامل کرنے کے مترادف ہے: نیا عنصر نیا ہیڈ بن جاتا ہے ( O(1) )۔ لیکن ایک ArrayList کے لیے، اس آپریشن کے لیے تمام عناصر کو دائیں طرف منتقل کرنے کی ضرورت ہوتی ہے ( O(n) )۔
90. ایک ArrayList ہیش سیٹ سے کیسے مختلف ہے؟
اگر ہم آپریشن بہ آپریشن کی بنیاد پر ArrayList اور LinkedList کا موازنہ کر سکتے ہیں تاکہ یہ تعین کیا جا سکے کہ کون سا بہتر ہے، ہمیں ArrayList اور HashSet کے درمیان اس طرح کا موازنہ کرنا اتنا آسان نہیں لگے گا ، کیونکہ یہ بالکل مختلف مجموعہ ہیں۔ آپ ایک میٹھے کا دوسرے سے موازنہ کر سکتے ہیں، لیکن میٹھے اور لذیذ ڈش کا موازنہ کرنا ایک چیلنج ہے - وہ تکلیف دہ طور پر مختلف ہیں۔ پھر بھی، میں ان کے درمیان کچھ اختلافات کی نشاندہی کرنے کی کوشش کروں گا:-
ArrayList فہرست انٹرفیس کو نافذ کرتا ہے جبکہ HashSet سیٹ انٹرفیس کو نافذ کرتا ہے ۔
-
ArrayList آپ کو انڈیکس کے ذریعہ ایک عنصر تک رسائی کی اجازت دیتا ہے: get آپریشن میں O(1) الگورتھمک پیچیدگی ہے، لیکن HashSet آپ کو صرف تکرار کے ذریعہ مطلوبہ عنصر تک رسائی حاصل کرنے دیتا ہے، جو O(1) سے O(n) تک الگورتھمک پیچیدگی پیدا کرتا ہے ۔
-
ArrayList ڈپلیکیٹ عناصر کی اجازت دیتا ہے۔ HashSet میں ، تمام عناصر منفرد ہوتے ہیں: HashSet میں پہلے سے موجود عنصر کو شامل کرنے کی کوئی بھی کوشش ناکام ہو جائے گی (ڈپلیکیٹس کو ہیش کوڈ کے ذریعے چیک کیا جاتا ہے، اس لیے اس مجموعہ کا نام)۔
-
ArrayList ایک اندرونی صف کا استعمال کرتے ہوئے لاگو کیا جاتا ہے، لیکن HashSet کو اندرونی HashMap کا استعمال کرتے ہوئے لاگو کیا جاتا ہے ۔
-
ArrayList عناصر کے اندراج کی ترتیب کو برقرار رکھتی ہے، لیکن HashSet ایک غیر ترتیب شدہ سیٹ ہے اور عناصر کی ترتیب کو برقرار نہیں رکھتا ہے۔
-
ArrayList کسی بھی تعداد میں null قدروں کی اجازت دیتا ہے، لیکن آپ HashSet میں صرف ایک null ویلیو شامل کر سکتے ہیں (بالآخر، عناصر کو منفرد ہونا چاہیے)۔
91. جاوا میں اتنے مختلف متحرک صفوں کے نفاذ کیوں ہیں؟
یہ زیادہ فلسفیانہ سوال ہے۔ ہم یہ بھی پوچھ سکتے ہیں کہ وہ اتنی نئی اور متنوع ٹیکنالوجیز کیوں لے کر آتے ہیں؟ سہولت کے لئے. اور یہی بات بڑی تعداد میں متحرک صف کے نفاذ کے بارے میں بھی درست ہے۔ ان میں سے کسی کو بھی بہترین یا مثالی نفاذ نہیں کہا جا سکتا۔ ہر ایک کے اپنے فوائد مخصوص حالات ہیں۔ ہمارا کام ان کے اختلافات اور ان کی طاقتوں/کمزوریوں کو جاننا ہے تاکہ وہ مجموعہ استعمال کر سکیں جو کسی بھی صورت حال کے لیے موزوں ترین ہو۔92. جاوا میں کلیدی قدر ذخیرہ کرنے کے اتنے مختلف نفاذ کیوں ہیں؟
یہاں صورتحال وہی ہے جو متحرک صف کے نفاذ کے ساتھ ہے۔ یقینی طور پر کوئی بھی ایسا نہیں ہے جو عالمی طور پر دوسروں سے بہتر ہے: ہر ایک کی طاقت اور کمزوریاں ہیں۔ اور یقیناً ہمیں ان کی طاقتوں کا بھرپور استعمال کرنا چاہیے۔ مثال: کنکرنٹ پیکیج، جس میں کئی ملٹی تھریڈ کلاسز ہیں، اس کے اپنے کنکرنٹ کلیکشن ہیں۔ ConcurrentHashMap کلاس کو ملٹی تھریڈڈ ماحول میں ڈیٹا کے ساتھ کام کرتے وقت حفاظت کے لحاظ سے معیاری HashMap پر ایک فائدہ ہوتا ہے، لیکن یہ سست کارکردگی کی قیمت پر آتا ہے ۔ اور نفاذات جو کسی بھی صورت حال میں بہترین انتخاب نہیں ہیں آہستہ آہستہ استعمال ہونا بند ہو جاتے ہیں۔ مثال کے طور پر: Hashtable ، جس کا اصل مقصد ایک تھریڈ سے محفوظ HashMap تھا ، بھول گیا ہے اور استعمال سے باہر ہو گیا ہے، کیونکہ ConcurrentHashMap ایک کثیر تھریڈ والے ماحول میں کام کرتے وقت Hashtable سے بھی بہتر ہے ۔93. میں عناصر کے مجموعے کو کیسے ترتیب دوں؟
کہنے کی پہلی بات یہ ہے کہ مجموعہ عناصر کی نمائندگی کرنے والی کلاس کو Comparable انٹرفیس کو لاگو کرنا چاہیے، جو compareTo طریقہ پر مشتمل ہے۔ یا آپ کو ایک ایسی کلاس کی ضرورت ہے جو Comparator انٹرفیس کو لاگو کرے، بشمول اس کے موازنہ کا طریقہ۔ دونوں طریقے بتاتے ہیں کہ دی گئی قسم کی اشیاء کا موازنہ کیسے کیا جائے۔ چھانٹتے وقت یہ اہم ہے، کیونکہ چھانٹنے والے الگورتھم کو یہ سمجھنے کی ضرورت ہے کہ عناصر کا موازنہ کرنے کے لیے کون سا اصول استعمال کرنا ہے۔ یہ بنیادی طور پر موازنہ کو براہ راست اس کلاس میں لاگو کرکے کیا جاتا ہے جسے آپ ترتیب دینا چاہتے ہیں۔ Comparator کا استعمال کم عام ہے۔ فرض کریں کہ آپ کسی لائبریری سے کلاس استعمال کر رہے ہیں اور یہ Comparable کو لاگو نہیں کرتا ہے ، لیکن آپ کو اس کی اشیاء کا مجموعہ ترتیب دینے کی ضرورت ہے۔ چونکہ آپ اس کلاس کے کوڈ کو تبدیل نہیں کرسکتے ہیں (سوائے اس کو بڑھا کر)، آپ Comparator کا نفاذ لکھ سکتے ہیں جو اس بات کی نشاندہی کرتا ہے کہ کلاس کی اشیاء کا موازنہ کیسے کیا جائے۔ اور ایک مثال۔ اگر آپ کو ایک ہی قسم کی اشیاء کو مختلف طریقوں سے ترتیب دینے کی ضرورت ہے، تو آپ مختلف حالات میں استعمال کرنے کے لیے متعدد Comparator نفاذ لکھ سکتے ہیں۔ ایک اصول کے طور پر، بہت سے آؤٹ آف دی باکس کلاسز، جیسے String ، پہلے سے ہی موازنہ انٹرفیس کو نافذ کرتی ہیں۔ اس کا مطلب ہے کہ آپ کو ان کلاسوں کا موازنہ کرنے کے بارے میں فکر کرنے کی ضرورت نہیں ہے۔ آپ صرف آگے بڑھ سکتے ہیں اور انہیں استعمال کرسکتے ہیں۔ پہلا اور سب سے واضح طریقہ TreeSet یا TreeMap کلاس استعمال کرنا ہے ۔ یہ کلاس عناصر کو کلاس عناصر کے ذریعہ نافذ کردہ موازنہ کی بنیاد پر ترتیب وار ترتیب میں ذخیرہ کرتے ہیں۔ یہ نہ بھولیں کہ TreeMap کلیدوں کو ترتیب دیتا ہے، اقدار کو نہیں۔ اگر آپ Comparable کے بجائے Comparator استعمال کرتے ہیں ، تو آپ کو Comparator آبجیکٹ کو مجموعہ کے کنسٹرکٹر کو منتقل کرنے کی ضرورت ہے جب آپ اسے بناتے ہیں:TreeSet treeSet = new TreeSet(customComparator);
لیکن کیا ہوگا اگر آپ کے پاس مختلف قسم کا مجموعہ ہے؟ آپ اسے کیسے ترتیب دیتے ہیں؟ اس صورت میں، کلیکشن یوٹیلیٹی کلاس کا دوسرا طریقہ — sort() طریقہ — موزوں ہے۔ طریقہ جامد ہے، لہذا آپ کو صرف کلاس کا نام پہلے سے لکھنا ہے اور پھر ترتیب دینے کے لیے فہرست میں پاس کرنا ہے۔ مثال کے طور پر:
Collections.sort(someList);
اگر آپ Comparable کے بجائے Comparator کا نفاذ استعمال کر رہے ہیں ، تو آپ کو اسے دوسری دلیل کے طور پر پاس کرنے کی ضرورت ہے:
Collections.sort(someList, customComparator);
یہ آپریشن پاس کردہ فہرست میں عناصر کی اندرونی ترتیب کو تبدیل کر دے گا: فہرست کو موازنہ کرنے والے کا استعمال کرتے ہوئے ترتیب دیا جائے گا۔ نوٹ کریں کہ پاس کردہ فہرست کو تبدیل کرنا ضروری ہے، ورنہ طریقہ ناکام ہو جائے گا اور ایک UnsupportedOperationException پھینک دے گا ۔ تیسرا آپشن یہ ہے کہ اسٹریم کلاس کے ترتیب شدہ طریقہ کو استعمال کیا جائے ، جو مجموعہ کے عناصر کو ترتیب دیتا ہے ۔ اگر ہم موازنہ استعمال کر رہے ہیں :
someList = someList.stream().sorted().collect(Collectors.toList());
اگر ہم Comparator استعمال کر رہے ہیں :
someList = someList.stream().sorted(customComparator).collect(Collectors.toList());
چوتھا طریقہ دستی طور پر ایک ترتیب الگورتھم کو نافذ کرنا ہے، مثال کے طور پر، bubble sort
یا merge sort
۔
آبجیکٹ کلاس۔ مساوی () اور ہیش کوڈ ()
94. جاوا میں آبجیکٹ کلاس کی مختصر تفصیل دیں۔
جائزے کے دوسرے حصے میں ، ہم نے پہلے ہی آبجیکٹ کلاس کے طریقوں پر تبادلہ خیال کیا ہے۔ یہاں میں آپ کو یاد دلاؤں گا کہ آبجیکٹ کلاس جاوا میں ہر کلاس کا آبجیکٹ ہے۔ اس کے 11 طریقے ہیں، جو بدلے میں تمام طبقات کو وراثت میں ملے ہیں۔
95. جاوا میں Equals() اور hashCode() کیا استعمال ہوتے ہیں؟
hashCode() آبجیکٹ کلاس کا ایک طریقہ ہے جو تمام کلاسوں کو وراثت میں ملا ہے۔ اس کا کام ایک ایسی تعداد پیدا کرنا ہے جو کسی خاص چیز کی نمائندگی کرتا ہو۔ عمل میں اس طریقہ کار کی ایک مثال HashMap میں مل سکتی ہے ، جہاں اسے کلیدی اشیاء پر مقامی ہیش کوڈ حاصل کرنے کے لیے کہا جاتا ہے، جو اس بات کا تعین کرے گا کہ کلیدی قدر کی جوڑی کونسی بالٹی (اندرونی صف کا سیل) میں ذخیرہ کیا جائے گا۔ یہ طریقہ عام طور پر equals() طریقہ میں اشیاء کی شناخت کے لیے اس کے اہم طریقوں میں سے ایک کے طور پر استعمال ہوتا ہے ۔ equals() آبجیکٹ کلاس کا ایک طریقہ ہے جس کا کام اشیاء کا موازنہ کرنا اور یہ طے کرنا ہے کہ آیا وہ برابر ہیں۔ یہ طریقہ ہر جگہ استعمال ہوتا ہے جہاں ہمیں اشیاء کا موازنہ کرنے کی ضرورت ہوتی ہے، کیونکہ معیاری == موازنہ آپریٹر اشیاء کے لیے موزوں نہیں ہے، کیونکہ یہ صرف آبجیکٹ کے حوالوں کا موازنہ کرتا ہے۔96. ہمیں جاوا میں equals() اور hashCode() کے درمیان معاہدے کے بارے میں بتائیں؟
سب سے پہلے، مجھے یہ کہنے دیجئے کہ equals() اور hashCode() طریقوں کو صحیح طریقے سے کام کرنے کے لیے ، ان کو درست طریقے سے اوور رائڈ کیا جانا چاہیے۔ ان کے نئے نفاذ کو ان اصولوں پر عمل کرنا چاہیے:- ایک جیسی آبجیکٹ جن کے لیے مساوی واپسی درست ہوتی ہے ان میں ایک ہی ہیش کوڈ ہونا چاہیے ۔
- ایک جیسے ہیش کوڈز والی اشیاء ضروری نہیں کہ برابر ہوں۔
GO TO FULL VERSION