JavaRush /Kurslar /All lectures for UZ purposes /Massivlar bilan ishlashning nozik tomonlari

Massivlar bilan ishlashning nozik tomonlari

All lectures for UZ purposes
Daraja, Dars
Mavjud

1. Massivlar xotirada

Oldingi misollardagi rasmlar biroz noaniq edi.

Massivlar yaratishda (xuddi stringlarni yaratishda bo'lgani kabi) xotirada ikkita bo'lak ajratiladi: biri massiv (konteyner) uchun va ikkinchisi esa u saqlagan manzil uchun. Berikut so'nggi holat quyidagi rasmda tasvirlangan:

Massivlar xotirada

Yashil rangda 10 ta int elementdan iborat massiv va int[] tipidagi o'zgaruvchi turibdi, u massivning manzilini xotirada saqlaydi.

Solishtirish uchun ko'k rangda int turidagi oddiy o'zgaruvchi ko'rsatilgan, u 199 qiymatini saqlaydi.

Stringlarning xotirada saqlanishiga o'xshab ketmayaptimi?

To'g'ri, stringlar. Va stringlar bilan ishlashda bo'lgani kabi, "massiv tipidagi o'zgaruvchilarni" bir-biriga moslashtirish mumkin:

Kod Tushuntirish
int[] a = new int[10];
a[2] = 4;
a[7] = 9;
int[] b = a;

a[9] = b[2] + a[7];

10 ta int elementdan iborat massiv yaratamiz.
2 indeksli hujayraga 4 qiymatini yozamiz.
7 indeksli hujayraga 9 qiymatini yozamiz.
b o'zgaruvchi a o'zgaruvchidagi manzilni saqlaydi.
Endi a va b xotirada bir xil obyekt-massivni ko'rsatmoqda.
Obyekt-massivning 9 indeksli hujayrasiga 2 (saqlangan 4) va 7 (saqlangan 9) hujayralardagi qiymatlar yig'indisini yozamiz.

Obyekt-massiv o'z o'rnida qoladi, o'zgaruvchilar a va b bir xil manzillarni (havolalarni) saqlashadi. Rasmga qarang:

Massivlar xotirada 2

2. Massiv bilan ishlashning batafsil xilasi

Massivni istalgan turdan yaratish mumkin. Buning uchun faqat tur nomidan keyin kvadrat qavslarni yozish kerak. Massiv yaratishning umumiy ko'rinishi:

tur[] nom = new tur[soni];

Bu yerda tur — massivda saqlamoqchi bo'lgan elementlarning (hujayralarning) turi. Nom — massivga murojaat qiladigan o'zgaruvchi nomi, soni esa massivda qancha hujayra borligini belgilaydi.

Yuqoridagi misolda kanonik shakl ko'rsatilgan: massiv o'zgaruvchisini yaratib, massiv obyektini yaratish. Bu aslida ikkita mustaqil tuzilish.

O'zgaruvchi-massiv va obyekt-massivni alohida yaratish mumkin:

tur[] nom;
nom = new tur[soni];

Va yana bir muhim jihat:

Massivning indekslari va massiv elementlari soni sifatida o'zgaruvchi va hatto butun ifodalar ishlatilishi mumkin.

Misollar:

Kod Tushuntirish
int n = 100;
int[] a = new int[n];
n elementdan iborat massiv yaratish
int n = 100;
int[] a = new int[n * 2 + 3];
203 elementdan iborat massiv yaratish
int n = 100;
int[] a = new int[n];
a[n-1] = 2;
a[n-2] = 3;
a[n/5] = a[n-1] + a[n-2]


// a[99] = 2;
// a[98] = 3;
// a[20] = a[99] + a[98];
Muhim:
Aytgancha, agar massivda mavjud bo'lmagan indeksga murojaat qilishga harakat qilsangiz (bizning holatimizda bu 0..99 dan boshqa butun sonlar), dastur ArrayIndexOutOfBoundsException xatoligi bilan to'xtaydi — indeks massiv chegaralaridan tashqarida.

3. Massiv uzunligi

Oldingi misolda ko'rganingizdek, massiv tipidagi o'zgaruvchi alohida yaratilishi va keyinchalik biror joyda unga qiymat (massiv obyektiga havola) belgilanadi. Hatto shunday qilish mumkin:

Kod Tushuntirish
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
int[] turidagi massiv o'zgaruvchi yaratish
Agar a o'zgaruvchi 10 dan kichik bo'lsa,
10 elementdan iborat massiv yaratish.
Aks holda,
20 elementdan iborat massiv yaratish

Va bunday massivda qanday ishlash kerak? Unda qancha element borligini qanday bilish mumkin?

Buning uchun massivda length deb nomlangan maxsus xususiyat (o'zgaruvchi) mavjud. Massiv uzunligini aniqlash uchun quyidagi ifodani ishlatishingiz mumkin:

array.length;

Bu yerda array — massiv o'zgaruvchining nomi, length esa massiv obyektining xususiyat nomi. length xususiyatidagi qiymatni o'zgartirish mumkin emas: length xususiyatni boshqa o'zgaruvchilarga belgilash mumkin, lekin bunga hech narsa belgilab bo'lmaydi (dastur oddiygina kompilyatsiya qilinmaydi).

Avvalgi misolni shunday davom ettirish mumkin:

Kod Tushuntirish
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
for (int i = 0; i < array.length; i++)
{
   System.out.println(array[i]);
} 
int[] turidagi massiv o'zgaruvchini yaratamiz.
Agar a o'zgaruvchi 10 dan kichik bo'lsa,
10 elementdan iborat massiv yaratamiz.
Aks holda,
20 elementdan iborat massiv yaratamiz.
Massivning barcha elementlari bo'ylab tsikl: 0 dan boshlab va array.length — 1 gacha

4. Java'da massivlar haqida faktlarni yangilash

Keling, massivlar haqida ma'lum faktlarni yakunlaymiz:

Fakt 1. Massiv ko'p hujayralardan iborat.

Fakt 2. Aniq hujayraga kirish uning raqamini ko'rsatish orqali amalga oshiriladi.

Fakt 3. Barcha hujayralar bir xil turga ega.

Fakt 4. Barcha hujayralar uchun boshlang'ich qiymat — 0 va null (agar hujayrada manzil saqlansa), false (boolean turi uchun). Default qiymatlar haqida ko'proq ma'lumotni bu darsda olasiz.

Fakt 5. String[] list – bu shunchaki o'zgaruvchi e'lon qilish: konteynerning o'zi (massiv-obyekt) hali yaratilmagan. U bilan ishlash uchun massivni (konteynerni) yaratish va uni ushbu o'zgaruvchiga joylashtirish kerak, so'ng undan foydalanish mumkin. Quyidagi misolni ko'ring.

Fakt 6. Obyekt-massivni (konteynerni) yaratishda uning uzunligini – unda qancha hujayra borligini ko'rsatish kerak. Bu new TypeName[n]; shaklidagi buyruq yordamida amalga oshiriladi.

Fakt 7. Massivning uzunligini .length xususiyat orqali aniqlash mumkin.

Fakt 8. Massiv yaratgandan so'ng uning elementlarining turini yoki sonini o'zgartirish mumkin emas.

Kod Tushuntirish
String s;
String[] list;
s null ga teng
list null ga teng
list = new String[10];
int n = list.length;
list o'zgaruvchisi 10 elementli string massiv obyektiga havolani saqlaydi.
n 10 ga teng
list = new String[0];

Endi list 0 elementdan tashkil topgan massivni saqlaydi. Massiv bor, lekin u elementlarni saqlay olmaydi.

list = null;
System.out.println(list[1]);
Dasturda xato (xato xabar) — dastur to'xtaydi. list bo'sh havolani saqlaydi — null
list = new String[10];
System.out.println(list[10]);
Dasturda xato (xato xabar) — massiv chegaralaridan tashqariga chiqish.
Agar list 10 element/hujayrani o'z ichiga olsa, ruxsat etilgan indekslar: 0 1 2 3 4 5 6 7 8 9 — jami 10 ta.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION