JavaRush /Java Blogu /Random-AZ /Şəkillərdə Java ArrayList

Şəkillərdə Java ArrayList

Qrupda dərc edilmişdir
Salam! Bugünkü mühazirə ArrayListəvvəlkilərdən bir tərəfdən daha sadə, digər tərəfdən isə daha çətin olacaq. Şəkillərdə işləyən ArrayList - 1Bu, daha çətindir, çünki bu gün "başlıq altına" baxacağıq ArrayListvə əməliyyatlar zamanı onunla nə baş verdiyini öyrənəcəyik. Digər tərəfdən, bu mühazirədə kod demək olar ki, olmayacaq - əsasən şəkillər və izahatlar. Beləliklə, gedək :) Artıq bildiyiniz kimi, " ArrayLista" daxilində məlumat anbarı kimi fəaliyyət göstərən adi bir massiv var. Əksər hallarda biz siyahının dəqiq ölçüsünü göstərmirik. Lakin daxili massiv müəyyən ölçüdə olmalıdır! Bu doğrudur. Onun standart ölçüsü [10]-dur .
public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
}
Şəkillərdə işləyən ArrayList - 2Əvvəlcə yeni element əlavə etməyin nəyə bənzədiyinə baxaq. Əvvəlcə daxili massivdə kifayət qədər yerin olub-olmadığını və daha bir elementin uyğun olub-olmadığını yoxlamaq üçün yoxlama aparılır. Boşluq varsa, yeni element siyahının sonuna əlavə edilir. “Sona qədər” dedikdə, massivin son xanasını nəzərdə tutmuruq (bu, qəribə olardı). Bu, son cari elementin yanındakı xanaya aiddir. Onun indeksi bərabər olacaq cars.size(). Siyahımız hazırda boşdur ( cars.size() = 0). Müvafiq olaraq, indeksi olan xanaya yeni element əlavə olunacaq 0.
ArrayList<Car> cars = new ArrayList<>();
Car ferrari = new Car("Ferrari 360 Spider");
cars.add(ferrari);
Şəkillərdə İşçi ArrayList - 3Burada hər şey aydındır. Yerləşdirmə ortada, yəni bir neçə element arasında aparılarsa nə olacaq?
public static void main(String[] args) {
   ArrayList<Car> cars = new ArrayList<>();
   Car ferrari = new Car("Ferrari 360 Spider");
   Car bugatti = new Car("Bugatti Veyron");
   Car lambo = new Car("Lamborghini Diablo");
   Car ford = new Car("Ford Modneo");

   cars.add(ferrari);
   cars.add(bugatti);
   cars.add(lambo);

   cars.add(1, ford);//добавляем ford в ячейку 1, которая уже занята
}
Yenə də əvvəlcə massivdə kifayət qədər yer olub-olmadığını yoxlayır. Kifayət qədər yer varsa, yeni elementi daxil etdiyimiz xanadan başlayaraq elementlər sağa sürüşdürülür . İndeksi 1 olan xanaya yapışdırırıq. Yəni 3-cü xanadan element 4-cü xanaya, 2-ci element 3-cü xanaya, 1-ci element 2-ci xanaya köçürülür Şəkillərdə İşçi ArrayList - 4. Bundan sonra yeni elementimiz yerinə yapışdırılır. Əvvəlki element ( bugatti) artıq oradan yeni yerə kopyalanıb. Şəkillərdə İşçi ArrayList - 5İndi isə seriala daxil etmək üçün yer olmasaydı, bu prosesin necə baş verəcəyini anlayaq. Şəkillərdə İşçi ArrayList - 6Əvvəlcə, əlbəttə ki, kifayət qədər yer olub-olmadığını yoxlamaq üçün yoxlama aparılır. Əgər kifayət qədər yer olmadığı ortaya çıxarsa, ArrayList'a daxilində yeni ölçü massivi (OldArray ölçüsü * 1.5) + 1 yaradılır.Bizim vəziyyətimizdə yeni massiv 16 xana ölçüsünə sahib olacaq. Bütün cari elementlər dərhal orada kopyalanacaq. Şəkillərdə ArrayList işi - 7Köhnə massiv zibil kollektoru tərəfindən silinəcək və yalnız yeni, genişləndirilmiş massiv qalacaq. İndi yeni element üçün boş yer var. Onu işğal olunmuş 3-cü hücrəyə yapışdırırıq. İndi tanış prosedur başlayır. 3-cü indeksdən başlayan bütün elementlər bir xana sağa sürüşdürülür və yeni element sakitcə əlavə olunur. Şəkillərdə İşçi ArrayList - 8İndi daxiletmə uğurludur! Daxil etməyi sıraladıq. İndi elementlərin çıxarılması haqqında danışaq . Xatırladığınız kimi, massivlərlə işləyərkən bir problemlə qarşılaşdıq: onları siləndə orada “deşiklər” qaldı. Yeganə həll yolu elementləri hər dəfə silinəndə sola köçürmək idi və siz dəyişmənin kodunu özünüz yazmalı idiniz. ArrayListeyni prinsiplə işləyir, lakin onda bu mexanizm artıq avtomatik olaraq həyata keçirilir. Şəkillərdə İşçi ArrayList - 9Göründüyü kimi: Şəkillərdə İşçi ArrayList - 10Və sonda istədiyimiz nəticəni əldə edirik: Şəkillərdə işləyən ArrayList - 11Element lambouğurla silindi. Burada ortadan bir silmə etdik. Aydındır ki, siyahının sonundan silmək daha sürətli olacaq, çünki istədiyiniz element bütün digərlərini dəyişdirmədən çıxarılır. Daxili massivin ölçüsünə və yaddaşda saxlanmasına bir daha nəzər salaq. Massivlərin genişləndirilməsi müəyyən miqdarda resurs tələb edən bir prosesdir. ArrayListBuna görə də, ən azı 100 elementdən ibarət olacağına əminsinizsə, standart ölçü ilə yaratmamalısınız . 100-cü elementi daxil etməyə çatanda daxili massiv hər dəfə bütün elementləri köçürməklə 6 dəfə genişlənəcək.
  • 10 elementdən 16-ya qədər
  • 16 elementdən 25-ə qədər
  • 25-dən 38-ə qədər
  • 38-dən 58-ə qədər
  • 58-dən 88-ə qədər
  • 88-dən 133-ə qədər (düstura görə (Köhnə Arrayın ölçüsü * 1.5) + 1)
Təbii ki, bu, resurslar baxımından kifayət qədər bahadır. Buna görə, saxlanılan elementlərin bəzi (ən azı təxmini) sayını artıq bilirsinizsə, dərhal müəyyən ölçülü bir sıra ilə bir siyahı yaratmaq daha yaxşıdır:
ArrayList<Car> cars = new ArrayList<>(100);
İndi 100 elementdən ibarət massiv dərhal yaddaşa yerləşdiriləcək, bu, daha səmərəli olacaq, çünki genişlənməyə resurslar sərf edilməyəcək. Sikkənin digər tərəfi də var. Obyektlər daxili massivdən çıxarıldıqda ArrayList, ölçü avtomatik olaraq kiçilmir. Məsələn, ArrayListtamamilə doldurulmuş 88 elementdən ibarət daxili massivimiz var: Şəkillərdə İşçi ArrayList - 13Proqramın işləməsi zamanı ondan 77 element çıxarırıq və yalnız 11-i qalır: Şəkillərdə İşçi ArrayList - 14Problemin nə olduğunu artıq təxmin etdinizmi? Yaddaşdan səmərəsiz istifadə, əlbəttə! Biz yalnız 11 xana istifadə edirik, halbuki yaddaşımız 88 element üçün ayrılmışdır - bu, ehtiyacımızdan 8 dəfə çoxdur! Bu vəziyyətdə optimallaşdırma aparmaq üçün xüsusi bir sinif metodundan istifadə edə bilərsiniz ArrayList- trimToSize(). O, daxili massivin uzunluğunu hazırda saxlanılan elementlərin sayına qədər “kəsdirir”. Şəkillərdə İşçi ArrayList - 15İndi lazım olan qədər yaddaş ayrılır! :)
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION