آتش بازي! هڪ پروگرامر هجڻ آسان ناهي. توهان کي مسلسل سکڻ جي ضرورت آهي، هميشه ڪجهه نئين سکيو. پر، جيئن ڪنهن ٻئي ڪاروبار ۾، سڀ کان ڏکيو ڪم شروع ڪرڻ آهي، توهان جي مقصد ڏانهن پهريون قدم کڻڻ. ۽ جڏهن کان توهان هن سائيٽ تي ويٺا آهيو ۽ هي مضمون پڙهي رهيا آهيو، توهان پهريون قدم مڪمل ڪيو آهي. هن جو مطلب اهو آهي ته هاڻي توهان کي پنهنجي مقصد ڏانهن مقصد سان اڳتي وڌڻ جي ضرورت آهي، بغير سست ٿيڻ يا رستي ۾ بند ٿيڻ جي. جيڪڏهن مان سمجهان ٿو صحيح طرح، توهان جو مقصد آهي هڪ جاوا ڊولپر ٿيڻ يا توهان جي ڄاڻ کي وڌائڻ جيڪڏهن توهان هڪ آهيو. جيڪڏهن ائين آهي، ته پوءِ توهان صحيح جاءِ تي آهيو، ڇو ته اسان 250+ جاوا ڊولپر جي انٽرويو سوالن جي وسيع فهرست جو تجزيو ڪندا رهنداسين. اچو ته جاري رکون!
مجموعو
84. اسان کي ٻڌاءِ اِيٽرٽرز ۽ انهن جي استعمال بابت
جاوا ڊولپر جي ڪنهن به انٽرويو ۾ مجموعا هڪ پسنديده موضوع آهن، ۽ جڏهن گڏ ڪرڻ واري درجه بندي بابت ڳالهائيندي، اميدوار اڪثر چوندا آهن ته اهو گڏ ڪرڻ جي انٽرفيس سان شروع ٿئي ٿو . پر اهو سچ ناهي، ڇاڪاڻ ته هن انٽرفيس جي مٿان هڪ ٻيو آهي - Iterable . هي انٽرفيس نمائندگي ڪري ٿو iterator() طريقو ، جيڪو توهان کي اجازت ڏئي ٿو هڪ Iterator اعتراض کي ڪال ڪرڻ جي موجوده مجموعي لاءِ. ۽ اصل ۾ هي Iterator اعتراض ڇا آهي ؟ هڪ آئٽرٽر هڪ اعتراض آهي جيڪو هڪ مجموعو ذريعي منتقل ڪرڻ جي صلاحيت فراهم ڪري ٿو ۽ عناصر جي مٿان ٻيهر ورجائي ٿو بغير صارف کي ڪنهن خاص مجموعي جي عمل کي ڄاڻڻ جي ضرورت آهي. اهو آهي، اهو هڪ قسم جو اشارو آهي مجموعي جي عناصر ڏانهن، جيڪو، جيئن ته هو، ان ۾ هڪ خاص جڳهه تي نظر اچي ٿو. آئٽرٽر ھيٺ ڏنل طريقا آھن:- hasNext() - واپسي صحيح آھي جيڪڏھن ڪو عنصر موجود آھي پوائنٽر کان پوءِ (ھي طريقو توھان کي معلوم ڪرڻ جي اجازت ڏئي ٿو ته ڇا مجموعو ختم ٿي ويو آھي)؛
- next() - پوائنٽر کان پوء ايندڙ عنصر کي واپس ڏئي ٿو. جيڪڏهن ڪو به ناهي، NoSuchElementException اڇلايو ويو آهي . اھو آھي، ھن طريقي کي استعمال ڪرڻ کان اڳ، اھو بھتر آھي ته پڪ ڪريو ته عنصر موجود آھي - hasNext() استعمال ڪندي ؛
- remove() - ايندڙ () طريقو استعمال ڪندي مجموعي مان حاصل ڪيل آخري عنصر کي هٽائي ٿو . جيڪڏهن اڳيون () ڪڏهن به نه سڏيو ويو آهي ان کان اڳ ريمو () سڏيو وڃي ٿو، هڪ استثنا اڇلايو ويندو - IllegalStateException ؛
- forEachRemaining(<Consumer>) - مجموعي جي هر عنصر سان منظور ٿيل عمل انجام ڏئي ٿو (طريقو جاوا 8 ۾ ظاهر ٿيو).
List<String> list = new ArrayList<>();
list.add("Hello ");
list.add("World, ");
list.add("It's ");
list.add("Amigo!");
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
iterator.next();
iterator.remove();
}
System.out.println(list.size());
ڪنسول ڏيکاريندو:
0
هن جو مطلب آهي ته عناصر کي هٽائڻ ڪامياب ٿي ويو. هڪ دفعو اسان وٽ هڪ آئٽرٽر هوندو هو، اسان هڪ طريقو استعمال ڪري سگهون ٿا اسڪرين تي سڀني عناصر کي پرنٽ ڪرڻ لاء:
iterator.forEachRemaining(x -> System.out.print(x));
پر ان کان پوءِ، آئٽرٽر وڌيڪ استعمال لاءِ نا مناسب ٿي ويندو، ڇاڪاڻ ته اهو سڄي لسٽ کي پار ڪري ڇڏيندو، ۽ هڪ باقاعده ٽريٽر وٽ پٺڀرائي ڪرڻ جا طريقا نه هوندا آهن. هتي اسين آهستي آهستي LinkedList ڏانهن وڃون ٿا ، يعني ان جو listIterator() طريقو ، جيڪو هڪ جديد قسم جو itereator - ListIterator موٽائي ٿو . ان کان علاوه باقاعده (معياري) ريٽٽر طريقن سان، هن وٽ اضافي آهن:
- add(<Element>) - لسٽ ۾ نئون عنصر داخل ڪري ٿو؛
- hasPrevious() - واپسي صحيح آھي جيڪڏھن ڪو عنصر موجود آھي پوائنٽر کان اڳ (ڇا اتي ھڪڙو اڳوڻو عنصر آھي)؛
- nextIndex() - انڊيڪس کي واپس ڪري ٿو ايندڙ عنصر جي لسٽ ۾ پوائنٽر کان پوء؛
- پوئين () - پوئين عنصر کي واپس ڏئي ٿو (پوائنٽ تائين)؛
- اڳوڻو انڊيڪس () - پوئين عنصر جي انڊيڪس موٽائي ٿو؛
- set(<Element>) - ايندڙ () يا پوئين() طريقن سان موٽايل آخري عنصر کي بدلائي ٿو .
85. جاوا ڪليڪشن فريم ورڪ ۾ ڪليڪشن hierarchy ڇا آهي؟
جاوا ۾ ٻه مجموعا hierarchies آهن. پهريون درجو آهي ڪليڪشن جو درجو پاڻ هيٺ ڏنل ڍانچي سان: اهو، بدلي ۾، هيٺين ذيلي مجموعن ۾ ورهايل آهي:- سيٽ هڪ انٽرفيس آهي جيڪو بيان ڪري ٿو اهڙي ڊيٽا جي جوڙجڪ هڪ سيٽ جي طور تي غير ترتيب ڏنل منفرد (غير ورجائيندڙ) عناصر تي مشتمل آهي. انٽرفيس کي معياري لاڳو ڪيو ويو آهي - TreeSet ، HashSet ۽ LinkedHashSet .
- فهرست ھڪڙو انٽرفيس آھي جيڪو ھڪڙي ڊيٽا جي جوڙجڪ کي بيان ڪري ٿو جيڪو شيون جي ترتيب ڏنل ترتيب کي ذخيرو ڪري ٿو. فهرست ۾ شامل واقعا داخل ڪري سگھجن ٿا ۽ حذف ڪري سگھجن ٿا انهن جي انڊيڪس ذريعي هن مجموعي ۾ (هڪ صف جي برابر، پر متحرڪ ريزائزنگ سان). انٽرفيس کي معياري لاڳو ڪيو ويو آهي - ArrayList , Vector ( جنهن کي متروڪ سمجهيو ويو ۽ اصل ۾ استعمال نه ڪيو ويو ) ۽ LinkedList .
- قطار هڪ انٽرفيس آهي جيڪو ڊيٽا جي جوڙجڪ کي بيان ڪري ٿو جيڪو عناصر کي قطار جي صورت ۾ محفوظ ڪري ٿو جيڪو FIFO - First In First Out قاعدي جي پيروي ڪري ٿو . انٽرفيس ۾ ھيٺ ڏنل معياري عمل آھن: LinkedList (ھا، اھو پڻ قطار لاڳو ڪري ٿو ) ۽ PriotityQueue .
86. ArrayList جي اندروني جوڙجڪ ڇا آهي؟
ArrayList هڪ صف وانگر آهي، پر متحرڪ طور تي وڌائڻ جي صلاحيت سان. هن جو ڇا مطلب آهي؟ حقيقت اها آهي ته ArrayList هڪ باقاعده صف جي بنياد تي ڪم ڪري ٿو، يعني، اهو عناصر کي اندروني صف ۾ محفوظ ڪري ٿو (ان جي ڊفالٽ سائيز 10 سيلز آهي). جڏهن اندروني صف مڪمل ٿي ويندي آهي، هڪ نئين صف ٺاهي ويندي آهي، جنهن جي ماپ فارمولا طرفان طئي ڪيو ويندو آهي:<размерТекущегоМассива> * 3 / 2 + 1
اهو آهي، جيڪڏهن اسان جي صف جي سائيز 10 آهي، نئين هڪ جي ماپ هوندي: 10 * 3 / 2 + 1 = 16. اڳيون، پهرين (پراڻي) صفن مان سڀئي قيمتون ان ۾ نقل ڪيون وينديون آهن. native System.arraycopy () طريقو ، ۽ پھريون صف ختم ٿي وئي آھي. دراصل، ھي آھي ڪيئن متحرڪ وسعت واري ArrayList کي لاڳو ڪيو ويو آھي . اچو ته سڀ کان وڌيڪ استعمال ٿيندڙ ArrayList طريقن تي نظر رکون : 1. add(<Element>) - هڪ عنصر شامل ڪري ٿو صف جي آخر ۾ (آخري خالي سيل ڏانهن)، ۽ پھريائين چيڪ ڪريو ته ڇا ھن صف ۾ جاءِ آھي. جيڪڏهن اهو نه آهي، هڪ نئين صف ٺاهي وئي آهي جنهن ۾ عناصر نقل ڪيا ويا آهن. هن آپريشن جي منطقي پيچيدگي O (1) آهي. ھڪڙو ساڳيو طريقو آھي - add(<Index>,<Element>) . اهو هڪ عنصر شامل ڪري ٿو فهرست جي آخر ۾ نه (سري)، پر انڊيڪس سان هڪ مخصوص سيل ڏانهن جيڪو هڪ دليل طور آيو آهي. هن معاملي ۾، logarithmic پيچيدگي جي لحاظ کان مختلف ٿيندو جتي ان کي شامل ڪيو ويو آهي:
- جيڪڏهن هي فهرست جي لڳ ڀڳ شروعات هئي، لاگارٿمڪ پيچيدگي O (N) جي ويجهو هوندي، ڇاڪاڻ ته نئين جي ساڄي پاسي واقع سڀني عنصرن کي هڪ سيل کي ساڄي طرف منتقل ڪرڻو پوندو؛
- جيڪڏهن عنصر وچ ۾ داخل ڪيو ويو آهي - O(N/2) ڇاڪاڻ ته اسان کي صرف اڌ فهرست جي عنصرن کي ھڪڙي سيل کي ساڄي طرف منتقل ڪرڻ جي ضرورت آھي.
87. LinkedList جي اندروني جوڙجڪ ڇا آهي؟
جيڪڏهن ArrayList هڪ اندروني صف ۾ عناصر تي مشتمل آهي، پوء LinkedList هڪ ٻيڻو ڳنڍيل فهرست جي صورت ۾ آهي. هن جو مطلب اهو آهي ته هر عنصر ۾ هڪ لنڪ شامل آهي پوئين عنصر ( اڳوڻي ) ۽ ايندڙ هڪ ( اگلا ). پھرين عنصر کي پوئين ھڪڙي سان ڪڙي نه آھي (اھو پھريون آھي)، پر اھو سمجھيو ويندو آھي فهرست جو سر، ۽ LinkedList کي سڌو سنئون ھڪڙي لنڪ آھي. آخري عنصر، حقيقت ۾، ايندڙ عنصر نه آهي، اهو فهرست جي دم آهي، ۽ تنهن ڪري ان سان سڌو ڳنڍيل آهي LinkedList پاڻ ۾ . تنهن ڪري، فهرست جي سر يا دم تائين رسائي جي منطقي پيچيدگي O(1) آهي. ArrayList ۾ ، جڏهن لسٽ وڌي وئي، اندروني صف وڌي وئي، پر هتي سڀ ڪجهه وڌيڪ آسانيء سان ٿئي ٿو - جڏهن هڪ عنصر شامل ڪيو وڃي، ڪجهه لنڪ صرف تبديل ڪن ٿا. اچو ته ڏسون ڪجھ سڀ کان وڌيڪ استعمال ٿيل LinkedlList طريقن : 1. add(<Element>) - لسٽ جي آخر ۾ شامل ڪرڻ، يعني. آخري عنصر کان پوء (5) نئين عنصر جي لنڪ شامل ڪئي ويندي جيئن ايندڙ . نئين عنصر کي پوئين عنصر وانگر آخري (5) سان ڳنڍيل هوندو . اهڙي آپريشن جي لاگارٿمڪ پيچيدگي O(1) هوندي، ڇاڪاڻ ته صرف آخري عنصر جي لنڪ جي ضرورت آهي، ۽ جيئن توهان کي ياد آهي، دم کي LinkedList کان سڌو سنئون ڳنڍيو ويو آهي ۽ ان تائين رسائي جي لاگارٿمڪ پيچيدگي گهٽ ۾ گهٽ آهي. 2. شامل ڪريو(<Index>,<Element>) - انڊيڪس ذريعي هڪ عنصر شامل ڪرڻ. جڏهن هڪ عنصر شامل ڪيو وڃي، مثال طور، فهرست جي وچ ۾، سر ۽ دم کان عناصر (ٻنهي پاسن تي) پهريون ڀيرو ٻيهر ورجائي رهيا آهن جيستائين گهربل جڳهه نه ملي. جيڪڏهن اسان ٽئين ۽ چوٿين جي وچ ۾ هڪ عنصر داخل ڪرڻ چاهيون ٿا (مٿي ڏنل شڪل ۾)، پوء جڏهن صحيح جڳهه ڳوليندا، ٽئين عنصر جي ايندڙ لنڪ اڳ ۾ ئي نئين هڪ ڏانهن اشارو ڪندي. نئين لاءِ، پوئين لنڪ ٽئين ڏانهن اشارو ڪندي. ان جي مطابق، چوٿين عنصر جو لنڪ - اڳوڻو - اڳ ۾ ئي نئين عنصر ڏانهن اشارو ڪندو، ۽ نئين عنصر جي ايندڙ لنڪ چوٿين عنصر ڏانهن اشارو ڪندي: هن طريقي جي منطقي پيچيدگي نئين عنصر کي ڏنل انڊيڪس تي منحصر هوندي:- جيڪڏهن اهو سر يا دم جي ويجهو آهي، اهو O(1) جي ويجهو هوندو، ڇاڪاڻ ته اهو اصل ۾ عناصر تي ٻيهر ڪرڻ جي ضرورت نه هوندي؛
- جيڪڏھن اھو وچ جي ويجھو آھي، ته پوءِ O(N/2) - ھيڊ ۽ دم جا عنصر گڏ ڪيا ويندا جيستائين گھربل عنصر ملي وڃي.
88. HashMap جي اندروني جوڙجڪ ڇا آهي؟
شايد جاوا ڊولپر جي انٽرويو دوران سڀ کان وڌيڪ مشهور سوالن مان هڪ. HashMap v اهم-قدر جوڑوں سان ڪم ڪري ٿو . اهي پاڻ HashMapv اندر ڪيئن محفوظ ٿيل آهن ؟ HashMap جي اندر اندر نوڊس جو هڪ صف آهي:Node<K,V>[] table
ڊفالٽ طور، صف جي سائيز 16 آھي، ۽ اھو ھر دفعي ٻيڻو ٿي ويندو آھي جيئن اھو عناصرن سان ڀريو ويندو آھي (جڏھن LOAD_FACTOR پھچي ويندو آھي - ھڪڙي خاص فيصد پوريءَ جو، ڊفالٽ طور اھو آھي 0.75 ). هر نوڊ ڪيئي جي هڪ هيش، هڪ ڪي، هڪ قدر، ۽ ايندڙ عنصر جي هڪ لنڪ کي محفوظ ڪري ٿو: دراصل، "اڳتي عنصر سان ڳنڍڻ" جو مطلب آهي ته اسان هڪ واحد ڳنڍيل فهرست سان ڪم ڪري رهيا آهيون، جتي هر عنصر هڪ لنڪ تي مشتمل آهي. ايندڙ. اھو آھي، HashMap ھڪڙي ھڪڙي ڳنڍيل فهرستن جي ھڪڙي صف ۾ ڊيٽا کي ذخيرو ڪري ٿو. پر مان فوري طور تي نوٽ ڪندس: جڏهن ٽيبل صف جي هڪ سيل ۾ هڪ جهڙي طرح سان ڳنڍيل فهرست جي هڪ ڪڙي آهي جنهن ۾ هڪ کان وڌيڪ عنصر شامل آهن، اهو سٺو ناهي. هن رجحان کي تصادم سڏيو ويندو آهي . پر پهرين شيون پهرين. اچو ته ڏسو ته ڪيئن هڪ نئون جوڙو محفوظ ڪيو ويو آهي put method استعمال ڪندي . پهريون، هيچ ڪوڊ () چاٻي جو ورتو ويو آهي. تنهن ڪري، hashmap صحيح طريقي سان ڪم ڪرڻ لاءِ ، توهان کي ڪلاس وٺڻ گهرجن جن ۾ هي طريقو ڪنجي جي طور تي ختم ڪيو ويو آهي. هي هيش ڪوڊ پوءِ اندروني طريقي ۾ استعمال ڪيو ويندو آهي - hash() - ٽيبل صف جي سائيز ۾ نمبر کي طئي ڪرڻ لاءِ . اڳيون، حاصل ڪيل نمبر استعمال ڪندي، ٽيبل جي ھڪڙي مخصوص سيل تائين پھچايو ويو آھي . هتي اسان وٽ ٻه ڪيس آهن:
- سيل خالي آهي - نئين نوڊ قدر ان ۾ ذخيرو ٿيل آهي .
- سيل خالي نه آهي - ڪنجين جي قيمت جي مقابلي ۾ آهي. جيڪڏهن اهي برابر آهن، نئين نوڊ جي قيمت پراڻي هڪ مٿان لکندو آهي، جيڪڏهن اهي برابر نه آهن، ايندڙ عنصر تائين رسائي حاصل ڪئي ويندي آهي ۽ ان جي چاٻي سان مقابلو ڪيو ويندو آهي ... ۽ ائين ئي جيستائين نئين قيمت ڪجهه پراڻي هڪ کي مٿي ڪري ٿو يا ان جي آخر تائين پهچي ٿو. اڪيلو ڳنڍيل فهرست ۽ اتي ذخيرو ڪيو ويندو آخري عنصر طور.
GO TO FULL VERSION