هڪ معياري سوال پيدا ٿئي ٿو: هڪ فهرست ڪيئن شروع ڪجي؟ هيٺ ڏنل ڪوڊ ڪم نه ڪندو: اهو هڪ تالیف جي غلطي جي نتيجي ۾ ٿيندو: مقامي متغير جا نالا شايد شروع نه ڪيا ويا آهن . جاوا وضاحت جي ضرورت آهي ته سڀئي مقامي متغير (جيڪي اسٽيڪ تي موجود آهن) مناسب قدرن سان شروع ڪيا وڃن. هي آهي توهان اهو ڪيئن ڪري سگهو ٿا: بغير ڪنهن شڪ جي، فهرست کي شروعات ڪرڻ گهرجي. توهان يا ته پهرين لڪير تي لسٽ ٺاهي سگهو ٿا، يا توهان ڪجهه هوشيار ڪم ڪري سگهو ٿا ۽ سست شروعات استعمال ڪري سگهو ٿا جيئن اسان getAllNames() طريقي ۾ ڪيو . انهي صورت ۾، فهرست صرف ان وقت ٺاهي ويندي جڏهن ضروري هجي - جيڪڏهن شروعاتي شرطن کي پورا نه ڪيو وڃي، فهرست ڪڏهن به ڍير تي ظاهر نه ٿيندي. هتي اسان بنيادي سوال ڏانهن اچون ٿا: اسان کي فهرست لاء ڪهڙي سائيز مقرر ڪرڻ گهرجي؟ بهترين اختيار اهو آهي ته هن کي درست سائيز ڏيو. مثال طور: هن صورت ۾، بلڪل 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 وغيره.
- هڪ مجموعو ٺاهيو صرف جڏهن توهان کي ضرورت هجي ، ٻي صورت ۾ ان کي شروع ڪريو null يا Collections.EMPTY_LIST استعمال ڪريو .
- جيڪڏھن توھان ڄاڻو ٿا درست سائيز گھربل ، ان کي ڪليڪشن ٺاھيندڙ ۾ بيان ڪريو.
- جيڪڏهن توهان کي پڪ آهي ته عناصر جو تعداد 10 کان وڌيڪ نه ٿيندو ، ڊفالٽ تعمير ڪندڙ استعمال ڪرڻ لاء آزاد محسوس ڪريو.
- صفر-سائز گڏ ڪرڻ سان لاڳاپيل خطرو اهو آهي ته نئين صفن ٺاهڻ ۽ ڊيٽا کي نقل ڪرڻ جي تعدد وڌيڪ ٿي سگهي ٿي. توهان کي تمام احتياط سان سوچڻ جي ضرورت آهي ته ڇا صفر-سائز مجموعن کي استعمال ڪرڻ جو فائدو واقعي وڏو آهي .
- جيڪڏهن توهان طريقي جي شروعات ۾ هڪ مجموعو تمام وڏو ڪيو آهي ۽ ان کي گهٽائڻ چاهيو ٿا، اتي آهي trimToSize() طريقو .
GO TO FULL VERSION