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. Bu, daha çətindir, çünki bu gün "başlıq altına" baxacağıq ArrayList
və ə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, " ArrayList
a" 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<>();
}
Ə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);
Burada 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 . Bundan sonra yeni elementimiz yerinə yapışdırılır. Əvvəlki element ( bugatti
) artıq oradan yeni yerə kopyalanıb. İndi isə seriala daxil etmək üçün yer olmasaydı, bu prosesin necə baş verəcəyini anlayaq. Ə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. Kö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. İ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. ArrayList
eyni prinsiplə işləyir, lakin onda bu mexanizm artıq avtomatik olaraq həyata keçirilir. Göründüyü kimi: Və sonda istədiyimiz nəticəni əldə edirik: Element lambo
uğ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. ArrayList
Buna 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)
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, ArrayList
tamamilə doldurulmuş 88 elementdən ibarət daxili massivimiz var: Proqramın işləməsi zamanı ondan 77 element çıxarırıq və yalnız 11-i qalır: Problemin 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”. İndi lazım olan qədər yaddaş ayrılır! :)
GO TO FULL VERSION