1. Stringмасив

Бих искал да ви дам кратък преглед на Stringмасивите.

Както казахме по-рано, масивът може да бъде от всяHowъв тип. Това означава, че можете да създадете масив от Strings. Ако искаме да напишем програма, която "чете 10 реда от клавиатурата и ги показва в обратен ред", ето How би изглеждал codeът:

Scanner console = new Scanner(System.in);
String[] array = new String[10];
for (int i = 0; i < 10; i++)
{
   array[i] = console.nextLine();
}
for (int i = 9; i >= 0; i--)
{
   System.out.println(array[i]);
}
Създайте Scannerобект
Създайте обект от масив от 10 елемента
Цикл от 0 до 9

Прочетете низ от клавиатурата и го запишете в следващата клетка на масива
Цикл от 9 до 0

Показване на следващата клетка в масива

Кодът почти не е променен! Трябваше само да заменим intс Stringпри създаването на масива. Е, и когато четем низа от клавиатурата, също заменихме метода nextInt()с nextLine().


2. Stringмасив в паметта

И още един полезен факт. Нека разгледаме 3 снимки:

Снимка 1. Как Stringобектът е подреден в паметта:

Масив от низове в паметта

Тази снимка е взета от предишни уроци.

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

Фигура 2. Как се подрежда целочислен масив в паметта:

Масив от низове в памет 2

Тази снимка също е позната.

Фигура 3. Как се подрежда низов масив в паметта:

Как низовият масив е подреден в паметта

Отляво виждаме масивна променлива, чийто тип е String[](съхранява address на обект от масив).

В средата имаме Stringсамия обект от масив.

А отдясно има низови обекти, които съхраняват няHowъв текст.

Клетките на Stringмасива не съхраняват самите низове (текста на String обектите). Вместо това те съхраняват своите addressи (препратки към тях). По същия начин, по който Stringпроменливите съхраняват addressите на низови обекти (където се съхранява текстът).

Вземете това предвид, когато сравнявате клетки от масив:

String[] array = new String[10];

array[1] = "Hello";
array[2] = array[1];
array[3] = new String("Hello");
// Compare
array[1] == array[2];
array[1] == array[3];
array[1].equals(array[3]);
array[1].equalsIgnoreCase(array[3]);
Създайте масив от 10 низа

Поставете стойности в масива



false (препратките са равни)
false (препратките не са равни)
true (низовете са равни)
true(низовете все още са равни)


3. Бърза инициализация на масив в Java

Масивите са супер полезни, така че създателите на Java се опитаха да направят работата с тях възможно най-удобна.

Първото нещо, което направиха, беше да опростят инициализацията на масива, процесът, чрез който доставяте началните стойности на масив.

В края на краищата, в допълнение към данните, прочетени от някъде, програмата доста често се нуждае от собствени вътрешни данни, за да работи. Да предположим например, че трябва да съхраним дължините на всеки месец в масив. Ето How може да изглежда codeът:

int[] months = new int[12];
months[0] = 31; // January
months[1] = 28; // February
months[2] = 31; // March
months[3] = 30; // April
months[4] = 31; // May
months[5] = 30; // June
months[6] = 31; // July
months[7] = 31; // August
months[8] = 30; // September
months[9] = 31; // October
months[10] = 30; // November
months[11] = 31; // December

Но благодарение на създателите на Java, има начин това да се напише по-сбито:

// Lengths of months of the year
int[] months = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

Можете просто да изброите всички стойности на масива, разделени със запетаи!

Удобно, нали? Но това не е всичко.

Както се случва, компилаторът може да определи типа на контейнера (обект на масив) въз основа на типа на стойностите на масива. И за да определите дължината на масива, е тривиално да преброите броя на елементите, записани във фигурните скоби.

Това означава, че този code може да бъде написан дори по-кратко:

// Lengths of months of the year
int[] months = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

Нещо за красота, нали? 🙂

Това се нарича "бърза инициализация на масив". Между другото, това работи за типове, различни от int...

// Names of months of the year
String[] months = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November ", "December"};