1. ArrayList
-in quruluşu
ArrayList
— Java-da elementləri saxlamaq üçün ən geniş yayılmış class-dır. Bəs bu ArrayList
-in quruluşu necədir və niyə hamı onu bu qədər çox sevir?
ArrayList
-in quruluşu çox sadə və mahiyyəti etibarilə dahiyanədir. Hər bir ArrayList
obyektinin daxilində iki field var:
- Elementlərin siyahısı olan massiv
- Siyahının element sayını saxlayan
size
dəyişəni
ArrayList
obyektinin daxilində adi bir massiv var! Amma yalnız bu deyil. Orada həmçinin siyahının uzunluğunu saxlayan size adlı dəyişən də var. Bu necə işləyir:
Əvvəlcə siyahının daxilindəki massiv 10 element uzunluğunda olur. size
isə 0-a bərabərdir.
Əgər siyahıya element əlavə edilsə, həmin element massivdə 0-cı hücrəyə yazılacaq və size
1-ə qədər artırılacaq.
Daha bir element əlavə etsək, o, massivdə 1-ci hücrəyə yazılacaq, size
yenə 1 artırılaraq artıq iki olacaq.
Əgər siyahıya növbəti elementi əlavə edərkən massivdə artıq yer yoxdursa, add()
metodunun içində belə bir proses baş verir:
- yeni bir massiv yaradılır, əvvəlkindən 1.5 dəfə daha uzun
- oraya mövcud massivdən bütün elementlər kopyalanır
ArrayList
obyektində köhnə massiv əvəzinə yeni massivə bir link saxlanılır- Yeni massivdə 10-cu hücrəyə ötürülən element yazılır
- size 1 artırılır və artıq 11 olur
Bənzər şəkildə, siyahının ortasına bir element əlavə edilərkən də proses gedir. Mövcud elementlər sağa 1 hücrə itələnir və uyğun hücrəyə lazım olan element yazılır.
İndi siyahıların istifadəsinin ən əsas ssenarilərinə baxacağıq:
2. Elementin ArrayList
-ə əlavə edilməsi
Gəlin siyahıya elementlər əlavə olunanda, siyahının içində nələr baş verdiyini araşdıraq. ArrayList obyektini yaratdıqdan dərhal sonra yaddaşda təxminən belə bir görünüş olur:
Bizdə ArrayList
tipli obyekt var, onun içində iki sahə (iki dəyişən) mövcuddur: massiv (data
) və elementlərin sayı (size
). data
10 elementdən ibarət konteynerin (massivin) linkini saxlayır.
Əgər biz massivə 5 rəqəmini əlavə etmək istəsək, vəziyyət belə olacaq:
Artıq massivdə 5 elementi saxlanılır, və size == 1
olur.
Əgər indi kimsə bizim ArrayList
obyektimizdə size()
metodunu çağırsə, o, siyahının elementlərinin sayını alacaq — 1. Siyahının elementlərinin sayı — massiv ölçüsü deyil.
Nə massiv ölçüsü, nə də massiv özü heç vaxt ArrayList
obyektinin xaricində mövcud olmayacaq (görünməyəcək). Bunlar ArrayList
-in daxili məlumatlarıdır və həmişə elə qalacaq.
Gəlin siyahıya daha 7 rəqəm əlavə edək: 10, 20, 30, 40, 50, 60, 70.
Onda yaddaşda vəziyyət belə olacaq:
Əgər indi size()
metodunu çağıraqsa, o, 8 ədəd qaytaracaq — siyahıda yeni elementlərin sayı. Bunun massiv ölçüsünə heç bir aidiyyəti yoxdur.
Bu şəkildə bir səhv var.
ArrayList
sinifi primitiv tipləri saxlaya bilmir, ona görə də int
tipi əvəzinə Integer
tipindən istifadə edir. Konteyner 5-70 qiymətlərini deyil, Integer
tipindəki obyektlərə olan linkləri saxlayır. Konteynerdə boş olan bütün hüceyrələr null
saxlayır.
3. Siyahının uzunluğunun artırılması
Gəlin siyahının daxilində nə baş verdiyini analiz edək, onun massivində boş yerlər qurtaranda.
Tutaq ki, bizdə 10 elementdən ibarət bir siyahı var idi:
Biz qərara gəldik ki, ona 100 ədədini əlavə edək, bu zaman add()
metodunda belə şeylər baş verəcək:
1-ci addım — yeni bir massiv yaradılması:
2-ci addım — bütün elementlərin köhnə massivdən yenisinə kopyalanması:
3-cü addım — massivlərin əvəzlənməsi (ArrayList
obyektinin içindəki massivə olan linkin dəyişdirilməsi):
4-cü addım — yeni ədədin əlavə edilməsi, bunun üçün biz çalışırdıq:
GO TO FULL VERSION