JavaRush /جاوا بلاگ /Random-UR /new ArrayList(????) کیسے اور کہاں شروع کرنا بہتر ہے۔
Vovan
سطح

new ArrayList(????) کیسے اور کہاں شروع کرنا بہتر ہے۔

گروپ میں شائع ہوا۔
کلیکشن فریم ورک کا استعمال کیے بغیر کوڈ لکھنا پاگل ہوگا۔ یہ جاوا کا ایک شاندار ٹکڑا ہے جس میں بہت سے صاف حل ہیں۔ زیادہ اہم بات، صفوں کے برعکس، آپ کو سائز کے بارے میں فکر کرنے کی ضرورت نہیں ہے۔ ArrayList اس وقت تک بڑھے گی جب تک کہ اس کی میموری ختم نہ ہوجائے۔ ڈویلپر کو ابتدائی سائز اور ArrayIndexOutOfBoundsException ایرر کے بارے میں فکر کرنے کی ضرورت نہیں ہے ۔ لیکن اگر میموری کی مقدار کو مانیٹر کرنے کی شرط ہو تو کیا ہوگا؟ کیا ہم مجموعوں کے ساتھ کام کرتے وقت میموری کو موثر طریقے سے استعمال کر سکتے ہیں؟
ایک معیاری سوال پیدا ہوتا ہے: فہرست کو کیسے شروع کیا جائے؟ نیچے دیا گیا کوڈ کام نہیں کرے گا: اس کے نتیجے میں تالیف کی خرابی ہو گی: مقامی متغیر کے ناموں کو شروع نہیں کیا گیا ہو گا ۔ جاوا تصریح کا تقاضا ہے کہ تمام مقامی متغیرات (وہ جو اسٹیک پر موجود ہیں) کو مناسب اقدار کے ساتھ شروع کیا جائے۔ اس طرح آپ یہ کر سکتے ہیں: بلا شبہ، فہرست کا آغاز ہونا چاہیے۔ آپ یا تو پہلی سطر پر فہرست بنا سکتے ہیں، یا آپ کچھ بہتر کر سکتے ہیں اور سست ابتداء کا استعمال کر سکتے ہیں جیسا کہ ہم نے getAllNames() طریقہ میں کیا تھا ۔ اس صورت میں، فہرست صرف اس وقت بنائی جائے گی جب ضروری ہو - اگر ابتدائی شرائط پوری نہیں ہوتی ہیں، تو فہرست کبھی بھی ڈھیر پر ظاہر نہیں ہوگی۔ یہاں ہم بنیادی سوال کی طرف آتے ہیں: فہرست کے لیے ہمیں کیا سائز مقرر کرنا چاہیے؟ بہترین آپشن اسے درست سائز دینا ہے۔ مثال کے طور پر: اس صورت میں، بالکل n ناموں کو واپس کرنا ضروری ہے، اور اس کے نتیجے میں، n عناصر کا ایک مجموعہ تخلیق ہوتا ہے۔ تاہم، n کی صحیح قدر ہمیشہ معلوم نہیں ہوتی ہے۔ یہاں تک کہ دی گئی مثال میں، کیا ہوگا اگر n=1000 اور صرف 100 نام دستیاب ہوں؟ مجموعوں کے ساتھ کام کرتے وقت، سب سے زیادہ مقبول طریقہ ڈیفالٹ کنسٹرکٹر کو کال کرنا ہے۔ اگر آپ جاوا سورس کوڈ (ورژن 1.6) کو دیکھیں جیسا کہ آپ دیکھ سکتے ہیں، پہلے سے طے شدہ طور پر 10 عناصر کی ایک فہرست بنائی جاتی ہے ۔ یعنی جب ہم فہرست میں 10 سے زیادہ عناصر کو ذخیرہ کرنے کا ارادہ نہیں رکھتے ہیں تو ہم ڈیفالٹ کنسٹرکٹر کو محفوظ طریقے سے استعمال کر سکتے ہیں۔ اگر آپ 11ویں عنصر کو شامل کرنے کی کوشش کرتے ہیں تو کیا ہوگا؟ ٹھیک ہے، کوئی بری بات نہیں... عنصر کامیابی سے شامل ہو جائے گا۔ طریقہ دیکھیں: صف کا سائز یقینی کیپیسی طریقہ کے ذریعہ کنٹرول کیا جاتا ہے ۔ سائز میں 1.5 گنا اضافہ ہوتا ہے ۔ ایک نئی صف بنائی جاتی ہے اور عناصر کو اس میں منتقل کر دیا جاتا ہے۔ اگر ہم سائز کو 10 پر سیٹ کرتے ہیں، تو 11ویں عنصر پر:
public List getAllNames() { List names; if (/*необходимые условия выполнены*/) { names = new ArrayList (); /*заполнение списка*/ } return names; }
List names = null; List names = new ArrayList (); List names = new ArrayList (0); List names = new ArrayList (size);
public List getTopNames (int n) { List names = null; if ( /*необходимые условия выполнены*/) { names = new ArrayList (n); /*заполнение списка*/ } return names; }
names = new ArrayList ();

/** * Конструирует пустой список с указанной начальной емкостью. * * @param initialCapacity начальная емкость списка * @exception IllegalArgumentException если указанная начальная емкость отрицательна * */ public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) this.elementData = new Object[initialCapacity]; } /** * Конструирует пустой список с начальной емкостью, равной 10. */ public ArrayList() { this(10); }
public Boolean add(E e) { ensureCapacity(size + 1); //увеличивает modCount!! elementData[size++] = e; return true; } public void ensureCapacity (int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { throw new IllegalArgumentException(“Illegal Capacity: ” + initialCapacity); Object oldData[] = elementData; int newCapacity = (oldCapacity * 3) / 2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity обычно ближе к размеру, так что это беспроигрышно: elementData = Arrays.copyOf(elementData, newCapacity); } }
  • سائز 10 * 3 / 2 + 1 = 16 میں بدل جاتا ہے۔
  • اگلا اضافہ = 16 * 3 / 2 + 1 = 25
  • اگلا اضافہ = 25 * 3 / 2 + 1 = 39 اور اسی طرح۔
100 عناصر کی صورت میں، JVM کو کئی بار ایک نئی صف بنانے اور اس میں عناصر کو کاپی کرنے کی ضرورت ہوگی۔ اس کو مدنظر رکھتے ہوئے، اگر سرنی کے مطلوبہ سائز کے بارے میں کوئی مفروضہ ہے، تو بہتر ہے کہ اس کے قریب ابتدائی گنجائش مقرر کی جائے۔ کارروائی کے لیے کچھ ہدایات یہ ہیں:
  1. ایک مجموعہ صرف اس وقت بنائیں جب آپ کو اس کی ضرورت ہو ، بصورت دیگر اسے کالعدم کرنے کے لیے شروع کریں یا Collections کا استعمال کریں ۔EMPTY_LIST ۔
  2. اگر آپ کو درست سائز کی ضرورت معلوم ہے ، تو اسے کلیکشن کنسٹرکٹر میں بتائیں۔
  3. اگر آپ کو یقین ہے کہ عناصر کی تعداد 10 سے زیادہ نہیں ہوگی تو بلا جھجھک ڈیفالٹ کنسٹرکٹر استعمال کریں۔
  4. صفر سائز کا مجموعہ بنانے سے وابستہ خطرہ یہ ہے کہ نئی صفیں بنانے اور ڈیٹا کاپی کرنے کی فریکوئنسی زیادہ ہوسکتی ہے۔ آپ کو بہت احتیاط سے سوچنے کی ضرورت ہے کہ آیا صفر سائز کے مجموعوں کو استعمال کرنے کا فائدہ واقعی اتنا اچھا ہے ۔
  5. اگر آپ نے طریقہ کے آغاز میں بہت بڑا مجموعہ شروع کیا ہے اور اسے کم کرنا چاہتے ہیں، تو trimToSize() طریقہ ہے ۔
بلاشبہ، یہ رہنما خطوط اس وقت لاگو ہوتے ہیں جب صف پر مبنی مجموعوں کے ساتھ کام کرتے ہیں، اور منسلک فہرست کے معاملے میں اس میں سے کوئی بھی معنی نہیں رکھتا۔ درحقیقت، یہ مسائل پروگرام کے قاتل ہونے کا امکان نہیں ہے، لیکن اگر تھوڑا بہتر کرنے کا موقع ہے، تو کیوں نہ اس کا استعمال کریں۔ کیا آپ کے پاس کوئی اور مفید مشورے ہیں؟ کیا آپ نے چیزوں کو بہتر بنانے کے طریقے تلاش کیے ہیں؟ یا یہ سب غیر ضروری ہے؟ آپ کیا سوچتے ہیں؟
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION