1. Масиви в паметта

В предишните примери илюстрациите бяха малко неточни.

При създаване на масиви (Howто при създаване на низове) се разпределят два отделни блока памет: един за съхранение на самия масив (контейнер) и втори блок за променливата, която съхранява неговия address . Картината по-долу представя това пояснение:

Масиви в паметта

Паметта, разпределена за масива от 10 intелементи и int[]променливата, която съхранява address на intмасива, е показана в зелено.

За сравнение, обикновена intпроменлива, съхраняваща стойността, 199е показана в синьо.

Това малко напомня на съхраняване на низове в паметта, не мислите ли?

Точно така, струни. И точно Howто когато работите с низове, можете да присвоите променливи на масива една на друга:

Код Обяснение
int[] a = new int[10];
a[2] = 4;
a[7] = 9;
int[] b = a;

a[9] = b[2] + a[7];
Създайте масив от 10 intелементи.
Присвоете стойността 4на клетката с индекс 2.
Присвоете стойността 9на клетката с индекс 7.
В bпроменливата запишете address, съхранен в aпроменливата.
Сега aи bпосочете към същия обект от масив в паметта.
В клетката на обекта на масива с индекс 9напишете сумата от стойностите, които се съхраняват в клетки 2(която съхранява стойността 4) и 7(която съхранява стойността 9).

Обектът на масива остава точно там, където е бил, а променливите aи bсъхраняват същия address (препратка) към същия обект. Погледни снимката:

Масиви в паметта 2

2. Повече подробности за работата с масиви

Можете да създадете масив от елементи от абсолютно всяHowъв тип. За да направите това, просто напишете квадратни скоби след името на типа. Най-общо създаването на масив изглежда така:

type[] name = new type[number];

Където type е типът на елементите, които ще съхраняваме в масива. Името е името на променливата, която ще използваме за препращане към масива, а числото е броят на клетките в масива.

Примерът по-горе е каноничната форма за създаване на променлива масив и обект масив. В действителност това са две отделни единици.

Можете да създадете променлива на масив отделно от обект на масив:

type[] name;
name = new type[number];

И още нещо, което не е без meaning:

Можете да използвате променливи or дори цели изрази като индексен масив и брой елементи на масива .

Примери:

Код Обяснение
int n = 100;
int[] a = new int[n];
Създайте масив от nелементи
int n = 100;
int[] a = new int[n * 2 + 3];
Създайте масив с 203елементи
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];
Важно:
Между другото, трябва да сте наясно, че ако се опитате да получите достъп до клетка от масив, като използвате индекс, който не съществува за масива (в нашия пример това означава всяко цяло число извън диапазона), тогава програмата ще се срине 0..99с ArrayIndexOfBoundException, което означава, че индексът е бил извън границите на масива.

3. Дължина на масива

Както видяхте в предишния пример, можете да създадете променлива от масив сама по себе си и след това по-късно да й присвоите стойност (препратка към обект от масив) някъде в codeа. Можете дори да направите това:

Код Обяснение
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
Създайте масивна променлива, чийто тип е int[]
Ако aпроменливата е по-малка от 10,
тогава създайте масив от 10елементи.
В противен случай
създайте масив от 20елементи

И сега Howво друго можете да направите с такъв масив? Откъде знаеш колко елемента има в него?

За да помогнат с това, масивите имат специално свойство (променлива), наречено length. Можете да намерите дължината на масив, като използвате този израз:

array.length;

Тук arrayе името на променливата на масива и lengthе името на свойството на масива. Стойността на lengthсвойството не може да бъде променена: lengthсамото свойство може да бъде присвоено на други променливи, но нищо не може да му бъде присвоено (ако се опитате да направите това, програмата просто няма да се компorра).

Можем да продължим с предишния пример така:

Код Обяснение
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[]
Ако aпроменливата е по-малка от 10,
тогава създайте масив от 10елементи.
В противен случай
създайте масив от 20елементи
Превъртете всички елементи на масива: от 0до дължинаarray.length - 1

4. Обобщение на фактите за масивите в Java

Нека обобщим Howво знаем за масивите:

Факт 1. Масивът се състои от много клетки.

Факт 2. Вие влизате в конкретна клетка, като използвате нейния номер (индекс).

Факт 3. Всички клетки са от един и същи тип.

Факт 4. Първоначалната стойност на всички клетки е 0 (ако клетките съхраняват числа), null(ако клетките съхраняват препратки към обекти) or false(ако клетките съхраняват booleanстойности). Ще научите повече за стойностите по подразбиране в тази глава .

Факт 5. String[] list е просто декларация на променлива. Това не създава самия контейнер (обект на масив). За да използвате променливата, първо трябва да създадете масив (контейнер) и да го присвоите на променливата. Вижте примера по-долу.

Факт 6. Когато създаваме масивен обект (контейнер), трябва да посочим колко е голям, т.е. колко клетки съдържа. Това се прави с израз като: new TypeName[n];

Факт 7. Дължината на масив може да бъде намерена с помощта на .lengthсвойството.

Факт 8. След като създадете масив, не можете да промените типа на неговите елементи or броя на елементите, които той съхранява.

Код Обяснение
String s;
String[] list;
sе null
listеnull
list = new String[10];
int n = list.length;
Променливата listсъхранява препратка към обект: низов масив, състоящ се от 10елементи.
nе10
list = new String[0];

Сега listсе отнася до масив от 0елементи. Масивът съществува, но не може да съхранява елементи.

list = null;
System.out.println(list[1]);
Ще бъде хвърлено изключение (програмна грешка), т.е. програмата ще се срине. listсъхранява препратка къмnull
list = new String[10];
System.out.println(list[10]);
Ще бъде генерирано изключение за масив извън границите (програмна грешка).
Ако a listсъхранява 10елементи/клетки, тогава валидните индекси са: 0 1 2 3 4 5 6 7 8 910елементи.