1. Arraysклас

Както отбелязахме по-рано, масивите са много полезни и често използвани в програмирането.

Създателите на Java много бързо забелязаха, че Java програмистите често пишат един и същ code, когато работят с масиви. Например, копиране на част от масив в друг масив, codeиране за запълване на всяка клетка от масив със същата стойност, показване на съдържанието на масив в удобен формат и т.н.

Ето защо те създадоха специалния Arraysклас (пълното му име е java.util.Arrays), поставяйки в него най-популярните действия, свързани с масиви.

Има много методи за всеки повод, но първо ще разгледаме само 10 от тях - най-простите и най-често използвани.


2.Arrays.toString()

Първият метод, който ще разгледаме, се нарича Arrays.toString(). Но първо, малко предистория.

Всеки масив в Java има toString()метод, който връща „текстово представяне на масива“. Можете да получите текстово представяне на масив, като използвате следния оператор:

String str = name.toString();

Къде nameе името на променливата на масива и strе името на променливата, която ще съхранява низовото представяне на масива.

Но ако се опитате да отпечатате масива на екрана с помощта на метода, най-вероятно ще видите нещо подобно:System.out.println(name)

I@37afeb11

Първата буква Iозначава, че това е intмасив, а символите след него @са address на масива в паметта. От една страна, точно това е информацията, съхранявана в променливата на масива, но от друга, очаквахме нещо различно, нали?

Искахме да видим стойностите в масива! И точно затова те измислиха метода Arrays.toString()- да покажат стойностите на масив. Ние го наричаме така:

String str = Arrays.toString(name);

Примери:

int[] array = {1, 2, 3};
String str = Arrays.toString(array);
Променливата strще съдържа низа:
"[1, 2, 3]"
int[] array = {};
String str = Arrays.toString(array);
Променливата strще съдържа низа:
"[]"
String[] array = {"Hi", "How's", "life?"};
String str = Arrays.toString(array);
Променливата strще съдържа низа:
"[Hi, How's, life?]"


3.Arrays.deepToString()

Но ако се опитате да конвертирате двуизмерен масив в using the Arrays.toString()метод на низ (за да го покажете), ще видите нещо познато:

[I@37afeb11, I@37afeb21, I@37afeb31]

Това е всичко, защото клетките на двумерен масив съхраняват препратки към едномерни масиви. И How се преобразуват едномерните масиви в низ? Точно Howто виждате по-горе.

Какво може да се направи? Как да покажем правилно двуизмерен масив?

За тази цел Arraysкласът има друг специален метод — deepToString(). Извикването изглежда така:

String str = Arrays.deepToString(name);

Този метод може да предава масиви, които са двумерни, едномерни, триизмерни or, като цяло, всяко измерение, и той винаги ще показва елементите на масива.
Забележка: методът Arrays.deepToString()не работи с едномерни масиви от примитиви (например int[]).

Примери:

Integer[] array = {1, 2, 3};
String str = Arrays.deepToString(array);
Променливата strще съдържа низа:
"[1, 2, 3]"
int[][] array = { {1, 1}, {2, 2}, {3, 3} };
String str = Arrays.deepToString(array);
Променливата strще съдържа низа:
"[[1, 1], [2, 2], [3, 3]]"
int[][][] array = { {{1, 2, 3}, {1}}, {{}} };
String str = Arrays.deepToString(array);
Променливата strще съдържа низа:
"[[[1, 2, 3], [1]], [[]]]"


4.Arrays.equals()

Разбрахме How да показваме масиви на екрана, но Howво да кажем за сравняването на масиви?

За да сравним низове, имаме equalsи equalsIgnoreCaseметоди, но Howви методи имат масивите?

Добрата новина е, че масивите имат equalsметод. Лошата новина е, че не сравнява съдържанието на масивите. Методът equalsна масивите прави същото като ==оператора - сравнява препратките. Примери:

Примери:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
boolean b = x1 == x2;


false(препратките не са еднакви)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
Методът equalsна arraysпросто сравнява препратките на два масива.

false(препратките не са еднакви)

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

И отново Arraysни идва на помощ or по-точно неговият Arrays.equals()метод. Ето How го наричаме:

Arrays.equals(name1, name2)

Методът връща true, ако масивите са с еднаква дължина и елементите им са еднакви. В противен случай се връща false.

Примери:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
Методът equalsна arrays просто сравнява препратките на два масива.

false(препратките не са еднакви)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
Arrays.equals(x1, x2);


true(съдържанието е равностойно)
int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3, 4};
Arrays.equals(x1, x2);


false(съдържанието на масивите е различно)

5.Arrays.deepEquals()

И, Howто вероятно вече се досещате, Arrays.equalsметодът няма да работи правилно за двумерни масиви: той третира двумерните масиви като едномерен масив, чиито елементи са addressи на едномерни масиви.

По този начин, за правилното сравняване на многоизмерни масиви ( n = 1, 2, 3,...), те излязоха с Arrays.deepEquals()метода. Извикването изглежда така:

Arrays.deepEquals(name1, name2)

Методът се връщаtrueако масивите са с еднаква дължина и елементите им са равни. В противен случай се връщаfalse. Ако елементите вътре в масива също са масиви, тогава Arrays.deepEquals()методът се използва за тяхното сравняване и т.н.

Примери:

int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
x1.equals(x2);
Методът equalsна arrays просто сравнява препратките на два масива.

false(препратките не са еднакви)
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
Arrays.equals(x1, x2);
Методът Arrays.equalsще сравнява и като едномерни масиви, които съхраняват препратки. Те съдържат различни препратки. (съдържанието на масивите не е равно) x1x2
false
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
Arrays.deepEquals(x1, x2);


true(съдържанието е равностойно)