ایک معیاری سوال پیدا ہوتا ہے: فہرست کو کیسے شروع کیا جائے؟ نیچے دیا گیا کوڈ کام نہیں کرے گا: اس کے نتیجے میں تالیف کی خرابی ہو گی: مقامی متغیر کے ناموں کو شروع نہیں کیا گیا ہو گا ۔ جاوا تصریح کا تقاضا ہے کہ تمام مقامی متغیرات (وہ جو اسٹیک پر موجود ہیں) کو مناسب اقدار کے ساتھ شروع کیا جائے۔ اس طرح آپ یہ کر سکتے ہیں: بلا شبہ، فہرست کا آغاز ہونا چاہیے۔ آپ یا تو پہلی سطر پر فہرست بنا سکتے ہیں، یا آپ کچھ بہتر کر سکتے ہیں اور سست ابتداء کا استعمال کر سکتے ہیں جیسا کہ ہم نے 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 اور اسی طرح۔
- ایک مجموعہ صرف اس وقت بنائیں جب آپ کو اس کی ضرورت ہو ، بصورت دیگر اسے کالعدم کرنے کے لیے شروع کریں یا Collections کا استعمال کریں ۔EMPTY_LIST ۔
- اگر آپ کو درست سائز کی ضرورت معلوم ہے ، تو اسے کلیکشن کنسٹرکٹر میں بتائیں۔
- اگر آپ کو یقین ہے کہ عناصر کی تعداد 10 سے زیادہ نہیں ہوگی تو بلا جھجھک ڈیفالٹ کنسٹرکٹر استعمال کریں۔
- صفر سائز کا مجموعہ بنانے سے وابستہ خطرہ یہ ہے کہ نئی صفیں بنانے اور ڈیٹا کاپی کرنے کی فریکوئنسی زیادہ ہوسکتی ہے۔ آپ کو بہت احتیاط سے سوچنے کی ضرورت ہے کہ آیا صفر سائز کے مجموعوں کو استعمال کرنے کا فائدہ واقعی اتنا اچھا ہے ۔
- اگر آپ نے طریقہ کے آغاز میں بہت بڑا مجموعہ شروع کیا ہے اور اسے کم کرنا چاہتے ہیں، تو trimToSize() طریقہ ہے ۔
GO TO FULL VERSION