JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ متحرڪ صفون

جاوا ۾ متحرڪ صفون

گروپ ۾ شايع ٿيل
جڏهن پيچيدگي جي مختلف درجي جا پروگرام ٺاهي رهيا آهن، هر ڊولپر ڪيترن ئي ڊيٽا جي قسمن کي استعمال ڪري ٿو، بشمول صفون. هي ڍانچي هڪ قسم جي هڪ سيٽ کي محفوظ ڪرڻ لاء مناسب آهي، وڏي ڪارڪردگي مهيا ڪري ٿي، ۽ عام طور تي آسان آهي. جاوا ۾ متحرڪ صفون - 1صفن جو هڪ اهم نقصان اهو آهي ته اهي جامد آهن: انهن جي سائيز کي اڳ ۾ بيان ڪيو وڃي. بهرحال، پروگرامر اڃا تائين نه ڄاڻندا آهن ته مستقبل جي اڳڪٿي ڪيئن ڪجي (جيستائين، يقينا، AI ظاهر ٿئي ٿو جيڪو معلومات کي ناقابل اعتبار حد تائين جلدي پروسيس ڪندو ۽ ڪنهن به واقعن جي اڳڪٿي ڪرڻ جي قابل هوندو). انهي سبب لاء، اسان هڪ ڍانچي ٺاهي جيڪا ان جي سائيز کي تبديل ڪري سگهي ٿي جڏهن پروگرام هلندي آهي. ان کي متحرڪ صف سڏيو ويندو آهي .

JavaRush ڪورس ۾ متحرڪ صفون

هي موضوع تمام گهڻي سمجهه ۽ واضح طور تي سطح 7 تي ۽ جزوي طور تي JavaSyntax جستجو ۾ JavaRush ڪورس جي سطح 8 تي ڍڪيل آهي. ڪيترن ئي ليڪچرن ۽ 18 مسئلن جي دوران، اهم مسئلا شامل ڪيا ويا آهن، متحرڪ صفن جا قسم ۽ انهن جي وچ ۾ فرق، ڪارڪردگي سميت. هي موضوع انتهائي اهم آهي، ڇاڪاڻ ته متحرڪ صفن ڊولپر کي ڊپريشن، سر درد کان نجات ڏياري ٿو ۽ ناقابل اعتبار وقت بچائي ٿو.

هڪ متحرڪ صف ڇا آهي؟

هڪ متحرڪ صف هڪ صف آهي جيڪا پروگرام جي عمل دوران ان جي سائيز کي تبديل ڪري سگهي ٿي. جاوا ۾، هي ڪردار خاص طور تي ArrayList ۽ LinkedList طبقن طرفان ادا ڪيو ويندو آهي. صفن جي برعڪس، ArrayList ۽ LinkedList ۾ صرف حوالن جي ڊيٽا جا قسم شامل آھن، اھو آھي، اھي رڳو شيون ذخيرو ڪري سگھن ٿا. خوشقسمتيءَ سان، جاوا وٽ آٽو باڪسنگ ۽ آٽو انباڪسنگ ميڪانيزم آھن جيڪي توھان کي اجازت ڏين ٿا ته ابتدائي قسمن کي متحرڪ صفن ۾ ذخيرو ڪرڻ لاءِ. هڪ جامد صف وانگر، هڪ متحرڪ صف هڪجهڙائي آهي، اهو آهي، اهو هڪ واحد ڊيٽا جي قسم کي ذخيرو ڪري سگهي ٿو. تنهن هوندي، وراثت واري ميڪانيزم ۽ انٽرفيس جي مناسب استعمال جي مهرباني، اهو ممڪن آهي ته هڪ متحرڪ صف ۾ مختلف طبقن جي مڪمل رينج کي ذخيرو ڪرڻ لاء جيڪي هڪ عام کان وراثت ۾ آهن، پر هيٺ ڏنل وڌيڪ. اهو آهي، هڪ جامد صف هن طرح ڪم ڪندو آهي: جاوا ۾ متحرڪ صفون - 2۽ جاوا ۾ هڪ متحرڪ صف هن ريت ڪم ڪندي (ٽيون قدم کان ڊراگرام جاري ڪندي): جاوا ۾ متحرڪ صفون - 3جاوا هڪ خاص اصلي فنڪشن کي استعمال ڪري ٿو هڪ صف کي نقل ڪرڻ لاء، تنهنڪري اهڙي "حرکت" تمام گهڻو ناهي. مهانگو.

اسان کي هڪ متحرڪ صف جي ضرورت ڇو آهي؟

جاوا ۾ هڪ متحرڪ صف استعمال ڪيو ويندو آهي هڪجهڙائي واري ڊيٽا جي سيٽن کي پروسيس ڪرڻ لاءِ جنهن جي سائيز ان وقت نامعلوم ناهي جڏهن پروگرام لکيو ويو آهي. مثال طور، توهان شايد هر ڪلائنٽ جي ڊيٽا کي ڪيش ڪرڻ چاهيو ٿا جيڪو هن وقت ايپليڪيشن استعمال ڪري رهيو آهي. اڳ ۾ ئي اهڙن گراهڪن جي تعداد جي اڳڪٿي ڪرڻ ناممڪن آهي. متحرڪ arrays کان سواء، هي مسئلو هيٺين اختيارن سان حل ڪري سگهجي ٿو:
  1. ھڪڙي وڏي صف ٺاھيو جيڪا 100٪ ضرورت کي پورو ڪرڻ جو امڪان آھي.
  2. هڪ جامد صف ٺاهيو جيڪو بفر طور ڪم ڪندو؛
  3. ٻين متحرڪ جوڙجڪ لاڳو ڪريو، جهڙوڪ سيٽ.
پهريون اختيار صرف هڪ سخت محدود حد جي صورت ۾ مناسب آهي. ٻين حالتن ۾، اهڙي هڪ صف وڏي مقدار ۾ ميموري جي جاء وٺي ويندي، جيڪا انتهائي غير موثر آهي. ٻئي کي بفر صاف ڪرڻ، پڙهڻ، وغيره لاءِ اضافي ميڪنڪس جي نفاذ جي ضرورت پوندي. ٽيون پڻ ڪارڪردگي ۾ اختلافن جي ڪري نقصان آهي.

جاوا ۾ هڪ متحرڪ صف ڇا ڪندو آهي؟

جاوا ٻولي ۾، ArrayList ۽ LinkedList طبقن کي متحرڪ صف طور ڪم ڪري ٿو. سڀ کان وڌيڪ عام طور تي استعمال ٿيل آهي ArrayList، جيئن ته اهو ڪم ڪري ٿو هڪ کلاسک صف طور، LinkedList جي برعڪس، جيڪو ٻيڻو ڳنڍيل فهرست جي تصور کي لاڳو ڪري ٿو. اسان ان بابت ٿوري دير بعد ڳالهائينداسين.

ArrayList، LinkedList - تصور ۽ آپريٽنگ ضابطا

ArrayList ھڪڙو کلاسک صف آھي جيڪو پروگرام جي عمل جي دوران وڌائي سگھجي ٿو. اهو هڪ باقاعده صف تي ٻڌل آهي: ان جي سائيز جڏهن ٺهيل آهي 10 عناصر. جيئن ماپ وڌندي، گنجائش وڌندي. ضابطا جن جي ذريعي ArrayList ڪم ڪري ٿو:
  • بس هڪ جامد صف وانگر، اهو 0 کان ترتيب ڏنل آهي؛
  • آخر ۾ داخل ٿيڻ ۽ انڊيڪس ذريعي رسائي تمام تيز آهن - O(1)؛
  • شروعاتي يا وچ ۾ هڪ عنصر داخل ڪرڻ لاء، توهان کي سڀني عناصر کي نقل ڪرڻ جي ضرورت پوندي هڪ سيل کي ساڄي طرف، ۽ پوء هڪ نئين عنصر کي گهربل پوزيشن تي پيسٽ ڪريو؛
  • قدر جي ذريعي پهچ عناصر جي تعداد تي منحصر آهي - O(n)؛
  • هڪ کلاسک صف جي برعڪس، اهو ذخيرو ڪري سگهي ٿو null؛
LinkedList جي صورت ۾، هر شيء ٿورو وڌيڪ پيچيده آهي: اهو هڪ ٻيڻو ڳنڍيل فهرست تي ٻڌل آهي. اهو آهي، ساخت جي طور تي، هي متحرڪ جاوا صف ڪيترن ئي پکڙيل شيون آهي جيڪي هڪ ٻئي ڏانهن اشارو ڪن ٿا. تصويرن سان وضاحت ڪرڻ آسان آهي. LinkedList جي اندر اسان وٽ هڪ مکيه اعتراض آهي Head، جيڪو عناصر جي تعداد بابت معلومات کي ذخيرو ڪري ٿو، ۽ انهي سان گڏ پهرين ۽ آخري عناصر جي لنڪ: جاوا ۾ متحرڪ صفون - 4هاڻي فيلڊ size = 0آهي، first۽ last = null. هر عنصر جيڪو هن فهرست ۾ شامل ڪيو ويو آهي هڪ الڳ اندروني اعتراض جو مواد آهي. اچو ته هڪ عنصر شامل ڪريون Johnny: جاوا ۾ متحرڪ صفون - 5هاڻي اسان وٽ "جاني" جي قدر سان هڪ نوڊ آهي. مکيه عنصر لاء، پهرين ۽ آخري عنصر ڏانهن لنڪ نئين نوڊ ڏانهن اشارو ڪيو. هي اعتراض پڻ پوئين ۽ ايندڙ عناصر سان ڳنڍيل آهي. پوئين عنصر جو ڳنڍڻو هميشه null هوندو، ڇاڪاڻ ته هي پهريون عنصر آهي، ۽ ايندڙ هڪ سان ڳنڍڻ هميشه null هوندو، ڇاڪاڻ ته اهو اڃا موجود ناهي. اچو ته هن کي درست ڪريون: جاوا ۾ متحرڪ صفون - 6هڪ نئون عنصر شامل ڪيو ويو قدر سان "واٽسن"، جيڪو ٻيو بڻجي ويو. مهرباني ڪري نوٽ ڪريو ته پهرين عنصر ۾ هڪ فيلڊ آهي nextجيڪو ايندڙ عنصر ڏانهن اشارو ڪري ٿو، ۽ نئين عنصر ۾ هڪ فيلڊ آهي previousجيڪو پوئين هڪ ڏانهن اشارو ڪري ٿو. مکيه عنصر لاء، آخري عنصر جي لنڪ هاڻي نئين نوڊ ڏانهن اشارو ڪري ٿو. هيٺ ڏنل ڊراگرام ڏيکاري ٿو ته فهرست جي وچ ۾ عناصر کي ڪيئن شامل ڪيو وڃي: جاوا ۾ متحرڪ صفون - 7هڪ نئون عنصر "Hamish" شامل ڪيو ويو آهي. ان کي لسٽ جي وچ ۾ داخل ڪرڻ لاءِ، صرف عناصر جي لنڪ کي ٻيهر تفويض ڪريو، جيئن شڪل ۾ ڏيکاريل آهي. اهي تمثيلون تفصيل ۾ وڃڻ جي بغير، مٿين سطح تي ٻٽي ڳنڍيل فهرست جي عمل کي بيان ڪن ٿيون. LinkedList بابت ڪهاڻي کي اختصار ڪرڻ لاءِ، اسان ان جي آپريشن لاءِ ڪيترائي قاعدا حاصل ڪري سگھون ٿا:
  • بس هڪ صف وانگر، اهو 0 مان ترتيب ڏنل آهي؛
  • پهرين ۽ آخري عنصر تائين رسائي عناصر جي تعداد تي منحصر نه آهي - O(1)؛
  • انڊيڪس ذريعي هڪ عنصر حاصل ڪرڻ، لسٽ جي وچ مان داخل ڪرڻ يا حذف ڪرڻ جو دارومدار عنصرن جي تعداد تي آهي - O(n)؛
  • توھان استعمال ڪري سگھوٿا آئٽرٽر ميڪانيزم: پوءِ داخل ٿيڻ ۽ ختم ٿيڻ مستقل وقت ۾ ٿيندو.
  • هڪ کلاسک صف جي برعڪس، اهو null ذخيرو ڪري سگهي ٿو.

ڪوڊ جا مثال

اچو ته ڪجهه مثالن جي ذريعي وڃو. ڪوڊ جي ٽڪڙن ۾ شامل آهن مثال ٻنهي لاءِ ArrayList ۽ LinkedList.

تخليق

// Создаем новый список
ArrayList<String> arrayList = new ArrayList<>();
// Создается новый список и указывается начальный размер внутреннего массива
ArrayList<String> arrayListLarge = new ArrayList<>(100000);

// Создаем новый LinkedList
LinkedList<String> linkedList = new LinkedList<>();

هڪ عنصر شامل ڪرڻ

// Новый элемент добавляется в конец
arrayList.add("Johhny");
// Новый элемент добавляется в указанную позицию (в данном случае — в начало)
arrayList.add(0, "Watson");

// Новый элемент добавляется в конец двусвязного списка
linkedList.add("Java");
// Новый элемент добавляется в нулевую позицию списка:
linkedList.addFirst("I think");
// Новый элемент добавляется в конец списка
linkedList.addLast("language");
// Новый элемент добавляется в указанную позицию
linkedList.add(2, "is a terrific");

// Получение размера списков
int arraySize = arrayList.size(); // 2
int linkedSize = linkedList.size(); // 4
پهرين نظر ۾، add()AND طريقا addLast()ساڳي ڪارڪردگي کي انجام ڏين ٿا، پر طريقو add()انٽرفيس مان LinkedList ۾ آيو List، ۽ طريقو addLastانٽرفيس مان آيو Deque. LinkedList انهن ٻنهي انٽرفيس کي لاڳو ڪري ٿو. هن معاملي ۾ سٺو عمل اهو طريقو استعمال ڪرڻ هوندو جيڪو مفهوم لاءِ سڀ کان وڌيڪ مناسب آهي. جيڪڏهن LinkedList هڪ قطار جي طور تي استعمال ڪيو وڃي، پوء اهو استعمال ڪرڻ لاء بهترين آهي addLast. جيڪڏهن LinkedList هڪ فهرست طور استعمال ڪيو وڃي، اهو استعمال ڪرڻ مناسب هوندو add().

هڪ عنصر کي هٽائڻ

// Удаление element по индексу
arrayList.remove(0);
// Удаление element по значению
arrayList.remove("Johnny");

// Удаление первого element в списке
linkedList.removeFirst();
// Удаление первого element в списке, фактически вызов предыдущего метода
linkedList.remove();
// Удаление последнего element в списке
linkedList.removeLast();
// Удаление первого вхождения element в список
linkedList.removeFirstOccurrence("language");
// Удаление последнего вхождения element в список
linkedList.removeLastOccurrence("Java");
// Удаление по индексу
linkedList.remove(2);
جيڪڏهن ڪا شئي انڊيڪس ذريعي ڊهي وڃي ٿي، ته طريقو حذف ٿيل اعتراض کي واپس ڏئي ٿو. جيڪڏهن ڪو اعتراض قدر جي حساب سان ڊهي ويندو آهي (يا LinkedList جي پهرين يا آخري عنصرن کي ڊاهيو ويندو آهي)، اهو طريقو صحيح موٽندو آهي جيڪڏهن اعتراض ملي ۽ ڊهي وڃي، ٻي صورت ۾ غلط .

ھڪڙي شيءَ تائين رسائي ۽ فهرست ڳولھيو

// Доступ к элементу по индексу
String arrayElement = arrayList.get(2);
// Поиск element по значению
int arrayIndex = arrayList.indexOf("Watson");
// Поиск последнего индекса вхождения element в список
int lastArrayIndex = arrayList.lastIndexOf("Watson");

// Доступ по индексу
String linkedElement = linkedList.get(3);
// Получение первого element
String firstLinkedElement = linkedList.getFirst();
// Получение последнего element
String lastLinkedElement = linkedList.getLast();

// Поиск element по значению
int linkedIndex = linkedList.indexOf("Java");
// Поиск последнего индекса вхождения element в список
int lastLinkedIndex = linkedList.lastIndexOf("Java");

لڙڪ ۾ هلڻ

// Использование обычного цикла
for(int i = 0; i<arrayList.size(); i++) {
  String value = arrayList.get(i);
  System.out.println(value);
}

for(int i = 0; i<linkedList.size(); i++) {
  String value = linkedList.get(i);
  System.out.println(value);
}

// Использование цикла for-each
for(String s : arrayList) {
  System.out.println(s);
}

for(String s : linkedList) {
  System.out.println(s);
}
هتي ان جي ڳولا جي باري ۾ چند لفظن چوڻ جي قابل آهي. ڪيترائي نوان ڊولپر، جڏهن فهرست ۾ هڪ عنصر ڳولي رهيا آهن، هڪ لوپ ۾ ڳولها شروع ڪن ٿا، طريقن جي موجودگي جي باوجود، سڀني عنصرن کي ڳولها هڪ سان موازنہ indexOf()ڪندي lastIndexOf(). توھان ھي طريقو پڻ استعمال ڪري سگھو ٿا contains()حقيقت حاصل ڪرڻ لاءِ ته ھڪڙو عنصر فهرست ۾ آھي:
boolean isContainsSherlock = arrayList.contains("Sherlock");
boolean isContainsPhp = linkedList.contains("Php");

وڌيڪ پڙهڻ لاء لنڪس

  1. هتي هڪ بهترين مضمون آهي هڪ ArrayList مان عناصر کي هٽائڻ بابت. انهي حقيقت جي ڪري ته هي هڪ متحرڪ جاوا صف آهي ، عناصر کي هٽائڻ ۾ ڪيترائي ذيلي ذخيرا آهن.
  2. ArrayList جا ڪم هتي تفصيل سان بيان ڪيا ويا آهن .
  3. LinkedList بابت ٿورو وڌيڪ .
  4. ArrayList ۽ LinkedList بابت Habr کان ڪجھ مضمون .
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION