JavaRush /Java Blogu /Random-AZ /new ArrayList(????) necə və harada işə salmaq daha yaxşıd...
Vovan
Səviyyə

new ArrayList(????) necə və harada işə salmaq daha yaxşıdır

Qrupda dərc edilmişdir
Kolleksiya çərçivəsini istifadə etmədən kod yazmaq dəlilik olardı. Bu, çox səliqəli həlləri olan gözəl Java parçasıdır. Daha da əhəmiyyətlisi, massivlərdən fərqli olaraq, ölçülərdən narahat olmaq lazım deyil. ArrayList yaddaşı bitənə qədər böyüyəcək. Tərtibatçının ilkin ölçü və ArrayIndexOutOfBoundsException xətası barədə narahat olması lazım deyil . Bəs yaddaşın miqdarına nəzarət etmək üçün bir şərt olarsa? Kolleksiyalarla işləyərkən yaddaşdan səmərəli istifadə edə bilərikmi?
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.
100 element olduqda, JVM bir neçə dəfə yeni massiv yaratmalı və elementləri ona köçürməlidir. Bunu nəzərə alaraq, massivin tələb olunan ölçüsü haqqında bir fərziyyə varsa, ilkin tutumu ona yaxın qoymaq daha yaxşıdır. Fəaliyyət üçün bəzi təlimatlar bunlardır:
  1. Yalnız sizə lazım olduqda kolleksiya yaradın , əks halda onu null olaraq işə salın və ya Collections.EMPTY_LIST istifadə edin .
  2. Tələb olunan dəqiq ölçüsü bilirsinizsə , onu kolleksiya konstruktorunda göstərin.
  3. Elementlərin sayının 10-dan çox olmayacağına əminsinizsə , standart konstruktordan istifadə etməkdən çekinmeyin.
  4. 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 .
  5. Əgər siz metodun əvvəlində çox böyük kolleksiya yaratmısınızsa və onu azaltmaq istəyirsinizsə, trimToSize() metodu var .
Əlbəttə ki, bu təlimatlar massiv əsaslı kolleksiyalarla işləyərkən tətbiq edilir və əlaqəli siyahı vəziyyətində bunların heç biri mənası yoxdur. Əslində, bu problemlərin proqramın qatilləri olması ehtimalı azdır, amma bir az daha yaxşı etmək imkanı varsa, niyə istifadə etməyəsiniz. Başqa faydalı məsləhətləriniz varmı? İşləri yaxşılaşdırmaq üçün yollar tapmısınız? Yoxsa bütün bunlar lazımsızdır? Nə fikirləşirsən?
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION