CodeGym /جاوا بلاگ /Random-UR /تصویروں میں اری لسٹ
John Squirrels
سطح
San Francisco

تصویروں میں اری لسٹ

گروپ میں شائع ہوا۔
ہائے! اس بارے میں آج کا سبق ArrayListپچھلے اسباق کے مقابلے میں آسان اور مشکل دونوں ہوگا۔
تصویروں میں اری لسٹ - 1
یہ زیادہ مشکل ہو گا کیونکہ آج ہم ArrayListمختلف آپریشنز کے دوران کیا ہوتا ہے اس کا مطالعہ کرنے جا رہے ہیں۔ دوسری طرف، اس سبق میں تقریباً کوئی کوڈ نہیں ہوگا۔ یہ زیادہ تر تصاویر اور وضاحتیں ہیں۔ ٹھیک ہے، چلیں:) جیسا کہ آپ پہلے ہی جانتے ہیں، ArrayListاس کے اندر ایک عام صف ہے، جو ڈیٹا اسٹور کے طور پر کام کرتی ہے۔ زیادہ تر معاملات میں، ہم فہرست کے صحیح سائز کی وضاحت نہیں کرتے ہیں۔ لیکن اندرونی صف کا کچھ سائز ہونا ضروری ہے! اور ایسا ہی ہوتا ہے۔ اس کا ڈیفالٹ سائز 10 ہے ۔
public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
}
تصویروں میں اری لسٹ - 2 پہلے، آئیے دیکھتے ہیں کہ نئے عناصر کو شامل کرنا کیسا لگتا ہے۔ کاروبار کا پہلا حکم یہ چیک کرنا ہے کہ آیا داخلی صف میں داخلی صف میں کافی جگہ ہے اور آیا ایک اور عنصر فٹ ہو جائے گا۔ اگر جگہ ہے، تو فہرست کے آخر میں نیا عنصر شامل کیا جاتا ہے۔ جب ہم "آخر تک" کہتے ہیں، تو ہمارا مطلب صف میں آخری پوزیشن نہیں ہے (یہ عجیب ہوگا)۔ ہمارا مطلب آخری موجودہ عنصر کے بعد کی پوزیشن ہے۔ اس کا اشاریہ ہوگا cars.size()۔ ہماری فہرست فی الحال خالی ہے ( cars.size() == 0) اس کے مطابق، نیا عنصر پوزیشن 0 پر شامل کیا جائے گا۔
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
تصویروں میں اری لسٹ - 3 یہ کافی واضح ہے۔ کیا ہوتا ہے اگر ہم درمیان میں داخل کریں، یعنی دوسرے عناصر کے درمیان؟
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 میں کاپی کیا جاتا ہے۔ پھر تصویروں میں اری لسٹ - 4 ہمارا نیا عنصر اس کی جگہ پر داخل ہوتا ہے۔ پچھلا عنصر (bugatti) پہلے ہی وہاں سے ایک نئی پوزیشن پر کاپی کیا جا چکا ہے۔ تصویروں میں اری لسٹ - 5 اب دیکھتے ہیں کہ یہ عمل کیسے ہوتا ہے اگر صف میں نئے عناصر داخل کرنے کے لیے کوئی جگہ نہ ہو۔ تصویروں میں اری لسٹ - 6 قدرتی طور پر، سب سے پہلے یہ دیکھنے کے لیے جانچ پڑتال کی جاتی ہے کہ آیا کافی جگہ ہے۔ اگر کافی گنجائش نہیں ہے، تو اس کے اندر ایک نئی صف بنائی جاتی ہے ArrayListجس کا سائز پرانی صف کے اوقات 1.5 جمع 1 کا سائز ہے، ہمارے معاملے میں، نئی صف کا سائز 16 ہوگا۔ تمام موجودہ عناصر کو وہاں کاپی کیا جائے گا۔ فوری طور پر تصویروں میں اری لسٹ - 7 پرانی صف کو کچرا جمع کرنے والے کے ذریعے حذف کر دیا جائے گا، اور صرف نئی، توسیع شدہ صف باقی رہے گی۔ اب ایک نئے عنصر کی گنجائش ہے۔ ہم اسے پوزیشن 3 پر داخل کر رہے ہیں، جس پر قبضہ کیا گیا ہے۔ اب واقف عمل شروع ہوتا ہے۔ تمام عناصر، انڈیکس 3 سے شروع ہوتے ہیں، ایک پوزیشن کو دائیں طرف منتقل کر دیا جاتا ہے، اور نیا عنصر خاموشی سے شامل کر دیا جاتا ہے۔ تصویروں میں اری لسٹ - 8 اور اندراج ہو گیا ہے! اور ہم اندراج کے ساتھ کر رہے ہیں. اب آئٹمز کو ہٹانے کے بارے میں بات کرتے ہیں ۔ آپ کو یاد ہوگا کہ ہم صفوں کے ساتھ کام کرتے وقت ایک پریشانی کا شکار ہوئے تھے: عناصر کو ہٹانے سے ایک صف میں "سوراخ" ہو جاتے ہیں۔ باہر نکلنے کا واحد راستہ ہر ہٹانے کے ساتھ رہ جانے والی اشیاء کو منتقل کرنا تھا ، اور اس شفٹ کو انجام دینے کے لیے ہمیں ہر بار اپنا کوڈ لکھنا پڑتا تھا۔ ArrayList اسی اصول کی پیروی کرتا ہے، لیکن یہ پہلے سے ہی اس طریقہ کار کو نافذ کرتا ہے۔ تصویروں میں اری لسٹ - 9 یہ اس طرح لگتا ہے: تصویروں میں اری لسٹ - 10 اور آخر میں ہمیں وہی ملتا ہے جو ہم چاہتے ہیں: تصویروں میں اری لسٹ - 11 عنصر 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، اندرونی صف کا سائز خود بخود کم نہیں ہوتا ہے۔ فرض کریں کہ ہمارے پاس ArrayList88 عناصر کی مکمل داخلی صف ہے: تصویروں میں اری لسٹ - 12 جیسے جیسے پروگرام چلتا ہے، ہم 77 عناصر کو ہٹا دیتے ہیں، تو صرف 11 رہ جاتے ہیں: تصویروں میں اری لسٹ - 13 کیا آپ نے پہلے ہی اندازہ لگا لیا ہے کہ مسئلہ کیا ہے؟ آپ سمجھ گئے، میموری کا غیر موثر استعمال! ہم یہاں صرف 11 پوزیشنیں استعمال کر رہے ہیں، لیکن ہم نے 88 عناصر کے لیے میموری مختص کی ہے۔ یہ ہماری ضرورت سے 8 گنا زیادہ ہے! اس صورت میں، ہم ArrayListکلاس کے مخصوص طریقوں میں سے ایک کے ساتھ اپنی میموری کے استعمال کو بہتر بنا سکتے ہیں: trimToSize()۔ یہ طریقہ اندرونی صف کی لمبائی کو اس میں ذخیرہ شدہ عناصر کی تعداد تک کم کرتا ہے۔ تصویروں میں اری لسٹ - 14 اب ہم نے صرف اتنی ہی میموری مختص کی ہے جتنی ہمیں ضرورت ہے! :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION