ہائے! اس بارے میں آج کا سبق
یہ زیادہ مشکل ہو گا کیونکہ آج ہم
ArrayList
پچھلے اسباق کے مقابلے میں آسان اور مشکل دونوں ہوگا۔
ArrayList
مختلف آپریشنز کے دوران کیا ہوتا ہے اس کا مطالعہ کرنے جا رہے ہیں۔ دوسری طرف، اس سبق میں تقریباً کوئی کوڈ نہیں ہوگا۔ یہ زیادہ تر تصاویر اور وضاحتیں ہیں۔ ٹھیک ہے، چلیں:) جیسا کہ آپ پہلے ہی جانتے ہیں، ArrayList
اس کے اندر ایک عام صف ہے، جو ڈیٹا اسٹور کے طور پر کام کرتی ہے۔ زیادہ تر معاملات میں، ہم فہرست کے صحیح سائز کی وضاحت نہیں کرتے ہیں۔ لیکن اندرونی صف کا کچھ سائز ہونا ضروری ہے! اور ایسا ہی ہوتا ہے۔ اس کا ڈیفالٹ سائز 10 ہے ۔
public static void main(String[] args) {
ArrayList<Car> cars = new ArrayList<>();
}
پہلے، آئیے دیکھتے ہیں کہ نئے عناصر کو شامل کرنا کیسا لگتا ہے۔ کاروبار کا پہلا حکم یہ چیک کرنا ہے کہ آیا داخلی صف میں داخلی صف میں کافی جگہ ہے اور آیا ایک اور عنصر فٹ ہو جائے گا۔ اگر جگہ ہے، تو فہرست کے آخر میں نیا عنصر شامل کیا جاتا ہے۔ جب ہم "آخر تک" کہتے ہیں، تو ہمارا مطلب صف میں آخری پوزیشن نہیں ہے (یہ عجیب ہوگا)۔ ہمارا مطلب آخری موجودہ عنصر کے بعد کی پوزیشن ہے۔ اس کا اشاریہ ہوگا cars.size()
۔ ہماری فہرست فی الحال خالی ہے ( cars.size() == 0
) اس کے مطابق، نیا عنصر پوزیشن 0 پر شامل کیا جائے گا۔
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
یہ کافی واضح ہے۔ کیا ہوتا ہے اگر ہم درمیان میں داخل کریں، یعنی دوسرے عناصر کے درمیان؟
public static void main(String[] args) {
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
Car bugatti = new Car("Bugatti Veyron");
Car lambo = new Car("Lamborghini Diablo");
Car ford = new Car("Ford Modneo");
cars.add(ferrari);
cars.add(bugatti);
cars.add(lambo);
cars.add(1, ford);// add ford to cell 1, which is already occupied
}
ایک بار پھر، سب سے پہلے ایک چیک ہے کہ آیا سرنی میں کافی جگہ ہے. اگر کافی جگہ ہے، تو عناصر کو دائیں طرف منتقل کیا جاتا ہے ، اس پوزیشن سے شروع ہوتا ہے جہاں ہم نیا عنصر داخل کر رہے ہیں۔ ہم پوزیشن 1 پر داخل کر رہے ہیں۔ دوسرے لفظوں میں، پوزیشن 3 سے عنصر کو پوزیشن 4 پر، عنصر 2 کو پوزیشن 3 میں، اور عنصر 1 کو پوزیشن 2 میں کاپی کیا جاتا ہے۔ پھر ہمارا نیا عنصر اس کی جگہ پر داخل ہوتا ہے۔ پچھلا عنصر (bugatti) پہلے ہی وہاں سے ایک نئی پوزیشن پر کاپی کیا جا چکا ہے۔ اب دیکھتے ہیں کہ یہ عمل کیسے ہوتا ہے اگر صف میں نئے عناصر داخل کرنے کے لیے کوئی جگہ نہ ہو۔ قدرتی طور پر، سب سے پہلے یہ دیکھنے کے لیے جانچ پڑتال کی جاتی ہے کہ آیا کافی جگہ ہے۔ اگر کافی گنجائش نہیں ہے، تو اس کے اندر ایک نئی صف بنائی جاتی ہے ArrayList
جس کا سائز پرانی صف کے اوقات 1.5 جمع 1 کا سائز ہے، ہمارے معاملے میں، نئی صف کا سائز 16 ہوگا۔ تمام موجودہ عناصر کو وہاں کاپی کیا جائے گا۔ فوری طور پر پرانی صف کو کچرا جمع کرنے والے کے ذریعے حذف کر دیا جائے گا، اور صرف نئی، توسیع شدہ صف باقی رہے گی۔ اب ایک نئے عنصر کی گنجائش ہے۔ ہم اسے پوزیشن 3 پر داخل کر رہے ہیں، جس پر قبضہ کیا گیا ہے۔ اب واقف عمل شروع ہوتا ہے۔ تمام عناصر، انڈیکس 3 سے شروع ہوتے ہیں، ایک پوزیشن کو دائیں طرف منتقل کر دیا جاتا ہے، اور نیا عنصر خاموشی سے شامل کر دیا جاتا ہے۔ اور اندراج ہو گیا ہے! اور ہم اندراج کے ساتھ کر رہے ہیں. اب آئٹمز کو ہٹانے کے بارے میں بات کرتے ہیں ۔ آپ کو یاد ہوگا کہ ہم صفوں کے ساتھ کام کرتے وقت ایک پریشانی کا شکار ہوئے تھے: عناصر کو ہٹانے سے ایک صف میں "سوراخ" ہو جاتے ہیں۔ باہر نکلنے کا واحد راستہ ہر ہٹانے کے ساتھ رہ جانے والی اشیاء کو منتقل کرنا تھا ، اور اس شفٹ کو انجام دینے کے لیے ہمیں ہر بار اپنا کوڈ لکھنا پڑتا تھا۔ ArrayList اسی اصول کی پیروی کرتا ہے، لیکن یہ پہلے سے ہی اس طریقہ کار کو نافذ کرتا ہے۔ یہ اس طرح لگتا ہے: اور آخر میں ہمیں وہی ملتا ہے جو ہم چاہتے ہیں: عنصر lambo
کو ہٹا دیا گیا ہے۔ یہاں ہم نے ایک عنصر کو درمیان سے ہٹا دیا ہے۔ واضح طور پر، فہرست کے آخر سے کسی عنصر کو ہٹانا تیز تر ہے، کیونکہ عنصر کو باقی تمام چیزوں کو منتقل کرنے کی ضرورت کے بغیر آسانی سے ہٹا دیا جاتا ہے۔ آئیے ایک لمحے کے لیے دوبارہ بات کرتے ہیں کہ داخلی صف کے طول و عرض اور اسے میموری میں کیسے ترتیب دیا جاتا ہے۔ ایک صف کو پھیلانے میں کچھ وسائل درکار ہوتے ہیں۔ ArrayList
اس کے مطابق، ڈیفالٹ سائز کے ساتھ نہ بنائیں اگر آپ کو یقین ہے کہ اس میں کم از کم 100 عناصر ہوں گے۔ جب آپ 100 واں عنصر داخل کریں گے تو داخلی صف کو 6 بار بڑھانا پڑے گا ، اور تمام عناصر کو ہر بار شفٹ کرنا پڑے گا۔
- 10 عناصر سے 16 تک
- 16 عناصر سے 25 تک
- 25 سے 38 تک
- 38 سے 58 تک
- 58 سے 88 تک
- 88 سے 133 تک (یعنی پرانی صف کے اوقات 1.5 جمع 1 کا سائز)
ArrayList<Car> cars = new ArrayList<>(100);
اب 100 عناصر کی ایک صف کے لیے میموری ایک ساتھ مختص کر دی جائے گی، جس سے سرنی زیادہ موثر ہو جائے گی (اسے بڑھانے کی ضرورت نہیں ہوگی)۔ اس حکمت عملی کا ایک دوسرا پہلو بھی ہے۔ جب آپ کسی سے اشیاء کو ہٹاتے ہیں تو ArrayList
، اندرونی صف کا سائز خود بخود کم نہیں ہوتا ہے۔ فرض کریں کہ ہمارے پاس ArrayList
88 عناصر کی مکمل داخلی صف ہے: جیسے جیسے پروگرام چلتا ہے، ہم 77 عناصر کو ہٹا دیتے ہیں، تو صرف 11 رہ جاتے ہیں: کیا آپ نے پہلے ہی اندازہ لگا لیا ہے کہ مسئلہ کیا ہے؟ آپ سمجھ گئے، میموری کا غیر موثر استعمال! ہم یہاں صرف 11 پوزیشنیں استعمال کر رہے ہیں، لیکن ہم نے 88 عناصر کے لیے میموری مختص کی ہے۔ یہ ہماری ضرورت سے 8 گنا زیادہ ہے! اس صورت میں، ہم ArrayList
کلاس کے مخصوص طریقوں میں سے ایک کے ساتھ اپنی میموری کے استعمال کو بہتر بنا سکتے ہیں: trimToSize()
۔ یہ طریقہ اندرونی صف کی لمبائی کو اس میں ذخیرہ شدہ عناصر کی تعداد تک کم کرتا ہے۔ اب ہم نے صرف اتنی ہی میموری مختص کی ہے جتنی ہمیں ضرورت ہے! :)
GO TO FULL VERSION