Standart sual yaranır: siyahını necə işə salmaq olar? Aşağıdakı kod işləməyəcək: Bu, kompilyasiya xətası ilə nəticələnəcək: Yerli dəyişən adları işə salınmamış ola bilər . Java spesifikasiyası bütün yerli dəyişənlərin (stekdə mövcud olanların) müvafiq dəyərlərlə işə salınmasını tələb edir. Bunu belə edə bilərsiniz: Şübhəsiz ki, siyahı işə salınmalıdır. Siz ya ilk sətirdə siyahını yarada bilərsiniz, ya da daha ağıllı bir şey edə və getAllNames() metodunda etdiyimiz kimi tənbəl başlanğıcdan istifadə edə bilərsiniz . Bu halda, siyahı yalnız lazım olduqda yaradılacaq - ilkin şərtlər yerinə yetirilmədikdə, siyahı heç vaxt yığında görünməyəcəkdir. Burada əsas suala gəlirik: siyahı üçün hansı ölçü təyin etməliyik? Ən yaxşı seçim ona dəqiq ölçü verməkdir. Məsələn: Bu halda tam olaraq n ad qaytarılmalıdır və nəticədə n elementdən ibarət kolleksiya yaradılır. Lakin n -nin dəqiq dəyəri həmişə məlum deyil. Hətta verilən misalda, əgər n=1000 və yalnız 100 ad varsa, necə? Kolleksiyalarla işləyərkən ən populyar üsul standart konstruktoru çağırmaqdır. Java mənbə koduna baxsanız (versiya 1.6) Gördüyünüz kimi, standart olaraq 10 elementdən ibarət siyahı yaradılır . Yəni siyahıda 10-dan çox elementi saxlamağı planlaşdırmadığımız zaman standart konstruktordan təhlükəsiz istifadə edə bilərik. 11-ci elementi əlavə etməyə çalışsanız nə olacaq? Yaxşı, pis heç nə yoxdur... element uğurla əlavə olunacaq. Metoduna baxın: Massivin ölçüsü təminCapacity metodu ilə idarə olunur . Ölçüsü 1,5 dəfə artır . Yeni massiv yaradılır və elementlər ona köçürülür. Ölçüsü 10-a təyin etsək, onda 11-ci elementdə:
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); } }
- ölçü 10 * 3 / 2 + 1 = 16 olaraq dəyişir
- növbəti artım = 16 * 3/2 + 1 = 25
- növbəti artım = 25 * 3/2 + 1 = 39 və s.
- Yalnız sizə lazım olduqda kolleksiya yaradın , əks halda onu null olaraq işə salın və ya Collections.EMPTY_LIST istifadə edin .
- Tələb olunan dəqiq ölçüsü bilirsinizsə , onu kolleksiya konstruktorunda göstərin.
- Elementlərin sayının 10-dan çox olmayacağına əminsinizsə , standart konstruktordan istifadə etməkdən çekinmeyin.
- Sıfır ölçülü kolleksiyanın yaradılması ilə bağlı risk odur ki, yeni massivlərin yaradılması və məlumatların surətinin çıxarılması tezliyi daha yüksək ola bilər. Sıfır ölçülü kolleksiyalardan istifadə etməyin faydasının həqiqətən bu qədər böyük olub olmadığı barədə çox diqqətlə düşünməlisiniz .
- Əgər siz metodun əvvəlində çox böyük kolleksiya yaratmısınızsa və onu azaltmaq istəyirsinizsə, trimToSize() metodu var .
GO TO FULL VERSION