1. Massiv — elementlər üçün konteynerdir
Yəqin ki, kompyuterlərin nəhəng həcmdə məlumatı işləyə bildiyini eşitmisiniz. Şərt operatoru (if-else) və dövrlər (for, while) buna, əlbəttə, kömək edir. Amma bununla çox irəli getməyəcəksiniz, çünki işlənəcək məlumatları hansısa yerdə saxlamaq lazımdır.
Bu məqsədlə Java-da, demək olar ki, bütün proqramlaşdırma dillərində olduğu kimi, massivlər (Array) kimi əla bir şey var. Onlara hələ “cədvəl” də deyilir.
Massiv — bu, tək bir dəyər deyil, bir neçə dəyəri saxlaya biləcəyiniz xüsusi obyektdir.

Əgər əvvəllər dəyişəni içində hər hansı bir dəyər saxlamağın mümkün olduğu bir qutu ilə müqayisə etmişdiksə, massiv — içəridə bölmələrə ayrılmış bir qutu kimidir. «Qutu-massivdə» hər bölmənin öz nömrəsi var. Nömrələmə, təbii ki, sıfırdan başlayır...
Başqa bir bənzətmə də verə bilərik. Gəlin adi yaşayış evini çoxmərtəbəli binayla müqayisə edək. Adi evdə bir ailə yaşayır, çoxmərtəbəli bina isə mənzillərə bölünüb. Adi evdə yaşayan ailəyə məktub yazmaq üçün onun unikal ünvanını göstərmək lazımdır. Mənzildə yaşayan ailəyə məktub yazmaq üçün isə evin unikal ünvanını və bir də mənzilin nömrəsini yazmaq lazımdır.
Deməli, massiv tipli dəyişən — çoxmərtəbəli bina kimidir. Orada tək bir dəyəri deyil, bir neçəsini saxlamaq olar. Belə dəyişəndə bir neçə mənzil (element) var və hər birinə onun nömrəsi (indeksi) ilə müraciət etmək mümkündür.
Bunun üçün dəyişənin adından sonra kvadrat mötərizələrdə müraciət etdiyimiz elementin indeksini göstərmək lazımdır. Bu olduqca sadədir:
array[indeks] = znachenie;
Harada ki, array — massiv tipli dəyişənin adıdır, indeks — massivdəki elementin nömrəsi, znachenie isə — göstərilən elementə yerləşdirmək istədiyimiz dəyərdir.
Amma əvvəlcə gəlin massivlərin necə yaradıldığını anlayaq.
2. Java-da elementlərdən ibarət massiv yaratmaq

Tutaq ki, proqramınız haradasa 100 tam ədədi saxlamaq məcburiyyətindədir. Böyük ehtimalla bunun üçün massiv uyğundur. Bəs onu necə yaratmaq olar?
Əgər bir tam ədəd saxlamaq istəsəydik, bizə int tipi kifayət edərdi, bəs 100 tam ədəd saxlamaq istəsək, yəqin ki, int tipli massivə ehtiyac olacaq. Onu yaratmaq üçün kod belə görünəcək:
int[] array = new int[100];
Gəlin burada nə yazıldığını başa düşək.
Yəqin artıq təxmin etdiyiniz kimi, bərabərlik işarəsinin solunda array adlı dəyişənin int[] tipində elan olunması var. int tipindən sonra gələn kvadrat mötərizələr bu “qutu” tipində tək bir dəyər deyil, bir neçəsinin saxlanılacağını bildirir.
Bərabərlik işarəsinin sağında isə new sözü ilə int tipində 100 elementlik (hüceyrəlik) obyektin yaradılması yazılıb. Bu da elə çətin deyil.
Məsələn, 20 elementdən ibarət və həqiqi ədədləri saxlamaq üçün massiv yaratmaq istəsəydik, onun yaradılma kodu təxminən belə olardı:
double[] vals = new double[20];
Massivdəki elementlərin sayına massivin ölçüsü və ya massivin uzunluğu deyilir. Bir çox dəyəri saxlaya bildiklərinə görə massivlərə bəzən konteyner də deyirlər.
Vacib fakt: massiv konteynerinin ölçüsünü yaradıldıqdan sonra dəyişmək olmaz.
Yenisini yaratmaq olar, amma artıq yaradılmış konteynerin uzunluğunu dəyişmək mümkün deyil.
3. Massivin elementləri ilə iş

Yaxşı, massiv yaratmağı öyrəndik, bəs onlarla düzgün necə işləmək lazımdır?
Demək olar ki, adi dəyişənlərlə olduğu kimidir, ancaq massiv tipli dəyişənin adı göstərildikdən sonra mütləq işlədiyimiz elementin nömrəsini (indeksini) göstərmək lazımdır.
Massivin elementlərinin nömrələnməsi həmişə sıfırdan başlayır. Əgər bizdə 10 elementli massiv varsa, onun elementlərinin nömrələri (indeksləri) 0..9 olacaq; əgər massiv 200 elementlidirsə, onda 0..199. Və sair bu qayda ilə.
Nümunələr:
int[] a = new int[10]; // int tipli 10 elementlik massiv yaradırıq.
a[2] = 4; // İndeksi 2 olan elementə 4 yazırıq.
a[7] = 9; // İndeksi 7 olan elementə 9 yazırıq.
a[9] = a[2] + a[5]; // İndeksi 9 olan elementə 2-ci və 5-ci elementlərin cəmini yazırıq
// (orada 4 var) və 5 (orada 0 var).
Bu kod icra edildikdən sonra yaddaşda belə məlumat saxlanılacaq:

Massivin sol sütununda (boz rənglə) — elementlərin nömrələri (indeksləri) göstərilib. Elementlərdə isə daxil etdiyimiz dəyərlər saxlanılır: 4, 9 və 4. Massiv yaradıldıqdan dərhal sonra onun elementləri sıfırlarla doldurulur.
Vacibdir. Massivin bütün elementləri eyni məlumat tipinə malikdir. Əgər String sətirlərindən ibarət massiv yaratmışıqsa, onun elementlərində yalnız sətirlər saxlanıla bilər. Massivin məlumat tipi onun yaradılması zamanı təyin olunur. Nə məlumat tipini, nə də massivin uzunluğunu sonradan dəyişmək mümkün deyil.
4. Yaddaşda massivlər
Əvvəlki nümunələrdəki şəkillər bir qədər dəqiqlikdən uzaq idi.
Massivlər (eləcə də sətirlər) yaradılarkən yaddaşda iki blok ayrılır: biri birbaşa massivin (konteynerin) saxlanılması üçün, digəri isə onun ünvanını saxlayan dəyişən üçün. Dəqiqləşdirilmiş vəziyyət aşağıdakı şəkildə göstərilib:

Yaşıl rənglə int tipli 10 elementli massiv və həmin int[] tipli dəyişən göstərilib; bu dəyişən yaddaşda int tipli massivə ünvanı (istinadı) saxlayır.
Müqayisə üçün, mavi rənglə int tipli adi dəyişən göstərilib; o, 199 dəyərini saxlayır.
Nədənsə sətirlərin yaddaşda saxlanılmasını xatırladır, elə deyilmi?
Düzdür, sətirlər kimi, “massiv tipli dəyişənləri” də bir-birinə mənimsətmək olar:
int[] a = new int[10]; // int tipli 10 elementlik massiv yaradırıq.
a[2] = 4; // İndeksi 2 olan elementə 4 yazırıq.
a[7] = 9; // İndeksi 7 olan elementə 9 yazırıq.
int[] b = a; // b dəyişəninə a dəyişənində olan ünvanı yazırıq.
// Artıq a və b yaddaşda eyni obyekt-massivə işarə edir.
a[9] = b[2] + a[7]; // Obyekt-massivin 9-cu elementinə
// 2-ci (orada 4 var) və 7-ci (orada 9 var) elementlərin cəmini yazırıq.
Bu zaman obyekt-massiv əvvəlki yerində qalacaq və a və b dəyişənləri eyni obyektə aparan eyni ünvanı (istinadı) saxlayacaq. Şəkilə baxın:

5. Massivlərlə daha ətraflı iş
Massivi istənilən tipdən yaratmaq olar. Bunun üçün tip adından sonra kvadrat mötərizə yazmaq kifayətdir. Massiv yaratmağın ümumi görünüşü belədir:
tip[] imya = new tip[kolichestvo];
Burada tip — massivdə saxlayacağımız elementlərin (hüceyrələrin) tipidir. Imya — massivi çağıracağımız dəyişənin adıdır, kolichestvo isə — massivdəki elementlərin sayıdır.
Yuxarıdakı nümunədə kanonik forma göstərilib: massiv tipli dəyişənin yaradılması və obyekt-massivin yaradılması. Əslində bunlar iki müstəqil konstruksiyadır. Massiv tipli dəyişəni və obyekt-massivi ayrıca yaratmaq olar:
tip[] imya;
imya = new tip[kolichestvo];
Və daha bir önəmli məqam
Massivin indeksi kimi də, elementlərin sayı kimi də dəyişənlər, hətta tam ifadələr də çıxış edə bilər.
Nümunələr:
int n = 100;
int[] a = new int[n]; // n elementdən ibarət massiv yaratmaq
int n = 100;
int[] a = new int[n * 2 + 3]; // 203 elementlik massiv yaratmaq
int n = 100;
int[] a = new int[n];
a[n-1] = 2; // a[99] = 2;
a[n-2] = 3; // a[98] = 3;
a[n/5] = a[n-1] + a[n-2] // a[20] = a[99] + a[98];
Massiv sərhədlərindən kənara çıxma
Yeri gəlmişkən, diqqətinizi ona yönəldirik ki, əgər massivdə mövcud olmayan indekslə elementə müraciət etməyə çalışsanız (bizim halımızda bu, 0..99 aralığından başqa bütün tam ədədlərdir), proqram ArrayIndexOutOfBoundsException xətası ilə qəza rejimində dayanacaq — indeks massiv sərhədlərini aşıb.
6. Massivin uzunluğu
Öncəki nümunədə gördüyümüz kimi, massiv tipli dəyişəni ayrıca yaratmaq və sonra kodun hansısa yerində ona dəyər (obyekt-massivin istinadı) mənimsətmək olar. Hətta belə də etmək mümkündür:
int[] array; // int[] tipli massiv dəyişəni yaradırıq
if (a < 10) // Əgər a dəyişəni 10-dan kiçikdirsə,
array = new int[10]; // onda 10 elementlik massiv yarat.
else // Əks halda
array = new int[20]; // 20 elementlik massiv yarat
Bəs belə massivlə sonra necə işləmək olar? Onun neçə elementi olduğunu necə bilmək olar?
Bunun üçün massivdə xüsusi bir xassə (dəyişən) var — length. Massivin uzunluğunu bu ifadə ilə öyrənmək olar:
array.length;
Harada ki, array — massiv tipli dəyişənin adıdır, length isə obyekt-massivin xassəsinin adıdır. length xassəsinin dəyərini dəyişmək olmaz: length xassəsinin dəyərini digər dəyişənlərə mənimsətmək olar, lakin ona heç nə mənimsətmək mümkün deyil (proqram sadəcə tərtib olunmayacaq).
Öncəki nümunəni belə davam etdirmək olar:
int[] array; // int[] tipli massiv dəyişəni yaradırıq
if (a < 10) // Əgər a dəyişəni 10-dan kiçikdirsə,
array = new int[10]; // onda 10 elementlik massiv yarat.
else // Əks halda
array = new int[20]; // 20 elementlik massiv yarat
for (int i = 0; i < array.length; i++) // Massivin bütün elementləri üzrə dövr: 0-dan array.length — 1-ə qədər
{
System.out.println(array[i]);
}
7. Java-da massivlər haqqında faktlar
Gəlin massivlər haqqında məlum faktları xülasə edək:
- Fakt 1. Massiv çoxlu elementdən ibarətdir.
- Fakt 2. Müəyyən elementə giriş onun nömrəsi göstərilməklə həyata keçirilir.
- Fakt 3. Bütün elementlər eyni tipdədir.
- Fakt 4. Bütün elementlər üçün başlanğıc dəyər — 0 və null (əgər elementdə ünvan saxlanılırsa), false ( boolean tipi üçün).
- Fakt 5. String[] list — bu sadəcə dəyişənin elan olunmasıdır: konteynerin (obyekt-massivin) özü hələ yaradılmayıb. Onunla işləmək üçün massivi (konteyneri) yaratmaq və onu həmin dəyişənə yazmaq, sonra isə ondan istifadə etmək lazımdır. Aşağıdakı nümunəyə baxın.
- Fakt 6. Obyekt-massiv (konteyner) yaratdıqda, onun uzunluğunu — neçə elementi olacağını göstərmək lazımdır. Bu, belə əmrlə edilir: new TypeName[n];
- Fakt 7. Massivin uzunluğunu .length xassəsi ilə öyrənmək olar.
- Fakt 8. Massiv yaradıldıqdan sonra nə elementlərinin tipini, nə də sayını dəyişmək olar.
String s; // s-in dəyəri null-dur
String[] list; // list-in dəyəri null-dur
list = new String[10]; // list dəyişəni 10 elementdən ibarət sətir massivi olan obyektə istinad saxlayır.
int n = list.length; // n 10-a bərabərdir
list = new String[0]; // İndi list 0 elementli massiv saxlayır.
// Massiv var, amma element saxlaya bilmir.
list = null;
System.out.println(list[1]); // Proqram xətası yaranacaq — proqram qəza rejimində dayanacaq.
// list boş istinad saxlayır — null
list = new String[10];
System.out.println(list[10]); // Xəta yaranacaq — massiv sərhədlərindən kənara çıxma.
// Əgər list 10 element/hüceyrə saxlayırsa, icazə verilən indekslər: 0 1 2 3 4 5 6 7 8 9 — cəmi 10 ədəd.
GO TO FULL VERSION