JavaRush /جاوا بلاگ /Random-SD /new ArrayList(????) ڪيئن ۽ ڪٿي شروع ڪرڻ بهتر آهي
Vovan
سطح

new ArrayList(????) ڪيئن ۽ ڪٿي شروع ڪرڻ بهتر آهي

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