JavaRush /Курси /Java Syntax Zero /Допоміжний клас Arrays

Допоміжний клас Arrays

Java Syntax Zero
Рівень 6 , Лекція 7
Відкрита

1. Клас Arrays

Як ми вже раніше казали, масиви — дуже корисна та часто використовувана річ у програмуванні.

Творці Java дуже швидко помітили, що Java-програмісти часто пишуть один і той самий код при роботі з масивами. Наприклад: «скопіювати частину масиву в інший масив», «заповнити всі комірки масиву однаковими значеннями», «вивести вміст масиву в зручному для читання вигляді на екран» і т.п.

Тому вони зробили спеціальний клас – Arrays (повне ім'я java.util.Arrays), у який помістили найпопулярніші дії при роботі з масивами.

У ньому дуже багато методів на всі випадки життя, але для початку ми розглянемо лише 10 з них — найпростіші та найчастіше використовувані.


2. Метод Arrays.toString()

І перший метод, який ми розглянемо, буде називатися Arrays.toString(). Але для початку трохи передісторії.

У кожного масиву в Java є метод toString(), який повертає «текстове представлення масиву». Отримати текстове представлення масиву можна за допомогою такої конструкції:

String str = ім'я.toString();

Де ім'я — це ім'я змінної-масиву, а str — це ім'я змінної, в яку збережеться строкове представлення масиву.

Але якщо ви спробуєте вивести масив на екран за допомогою методу System.out.println(ім'я), скоріше за все побачите щось типу:

I@37afeb11

Перша літера I означає, що це масив типу int, а символи після @ – адреса масиву в пам'яті. З одного боку, змінна-масив саме цю інформацію і зберігає, а з іншого — ми очікували інше, правда?

Хотілося б побачити значення, які є в масиві! І саме для того, щоб побачити саме значення масиву, і придумали метод Arrays.toString(). Його виклик виглядає так:

String str = Arrays.toString(ім'я);

Приклади:

int[] array = {1, 2, 3};
String str = Arrays.toString(array);
Змінна str міститиме строкове значення:
"[1, 2, 3]"
int[] array = {};
String str = Arrays.toString(array);
Змінна str міститиме строкове значення:
"[]"
String[] array = {"Привіт", "Як", "Справи"};
String str = Arrays.toString(array);
Змінна str міститиме строкове значення:
"[Привіт, Як, Справи]"


3. Метод Arrays.deepToString()

Але якщо ти за допомогою методу Arrays.toString() спробуєш перетворити в рядок (вивести на екран) двовимірний масив, побачиш щось знайоме:

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

Уся справа в тому, що в комірках двовимірного масиву зберігаються посилання на одномірні масиви. А як одномірні масиви перетворюються на рядок? Саме так, як ти бачиш вище.

І що ж робити? Як отримати правильне відображення двовимірного масиву?

Для цього у класу Arrays є ще один спеціальний метод — deepToString(). Виклик його виглядає так:

String str = Arrays.deepToString(ім'я);

У цей метод можна передати двовимірний, одномірний, тривимірний і взагалі масив будь-якої розмірності, і він завжди буде відображати елементи масиву.
Зверни увагу: метод 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()

З виведенням масивів на екран ми розібралися, а що щодо порівняння масивів?

Для порівняння рядків у нас були методи equals та equalsIgnoreCase, а які методи є у масивів?

Гарна новина: у масивів є метод 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 у масивів банально порівнює посилання двох масивів.

false (посилання не рівні)

І що ж робити? Як порівняти масиви за їх вмістом?

І знову нам на допомогу приходить клас Arrays, а точніше, його метод Arrays.equals() Виглядає його виклик так:

Arrays.equals(ім'я1, ім'я2)

Метод повертає true (істина), якщо масиви однакової довжини і їх елементи рівні. Інакше повертає false (хибність).

Приклади:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
x1.equals(x2);
Метод equals у масивів банально порівнює посилання двох масивів.

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()

І як ти вже, мабуть, здогадуєшся, метод Arrays.equals для двовимірних масивів працюватиме неправильно: він працює з двовимірним масивом як з одновимірним, елементи якого — адреси одновимірних масивів.

Тому, щоб правильно порівнювати багатовимірні масиви (n=1, 2, 3, ...), придумали метод Arrays.deepEquals(). Його виклик виглядає так:

Arrays.deepEquals(ім'я1, ім'я2)

Метод повертає true (істина), якщо масиви однакової довжини і їх елементи рівні. Інакше повертає false (хибність). Якщо елементи всередині масиву — теж масиви, для їх порівняння використовується метод Arrays.deepEquals() і т.д.

Приклади:

int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
x1.equals(x2);
Метод equals у масивів банально порівнює посилання двох масивів.

false (посилання не рівні)
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
Arrays.equals(x1, x2);
Метод Arrays.equals порівняє x1 і x2 як одновимірні масиви, які зберігають посилання. У них зберігаються різні посилання.
false (вміст масивів не рівний)
int[][] x1 = {{1, 2, 3}, {4, 5, 6}};
int[][] x2 = {{1, 2, 3}, {4, 5, 6}};
Arrays.deepEquals(x1, x2);


true (вміст масивів рівний)

Коментарі (11)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Hemoul Рівень 8
1 грудня 2022
Хтось може пояснити - в статті є отака фраза: Зверніть увагу: метод Arrays.deepToString() не працює з одновимірними масивами примітивів (наприклад, int[]). Але першим же прикладом - іде саме виведення одновимірного масіву типу int[]. Десь тут помилка чи як?
Roma Chernesh Рівень 16
7 грудня 2022
Спочатку навіть не звернув увагу. Там у прикладі показано, що цей метод працює із Integer[ ], а із int[ ] - ні. Integer[] array = {1, 2, 3}; // все працює deepToString int[] array = {1, 2, 3}; //incompatible types: int[] cannot be converted to java.lang.Object[]
Anonymous #3257141 Рівень 18
21 лютого 2023
Якщо подивитися під капот методу deepToString:

public static String deepToString(Object[] a) {
, то можна побачити, що даний метод приймає масив об'єктів, а для того, щоб ми могли працювати з примітивами як з об'єктами існують класи обгортки. В даному випадку ми використовуємо клас Integer, щоб працювати з примітивами типу int.
dianosauric Рівень 42
9 вересня 2022
Те відчуття, коли задачі просто по лекціям
Neridnyi Taras Рівень 23
20 вересня 2022
Плюсую ,аж захотілось продовжувати вивчення
dianosauric Рівень 42
20 вересня 2022
а чому зникало бажання?
Neridnyi Taras Рівень 23
20 вересня 2022
Часто таке буває . Найчастіше коли не Можу виконати Щось справді важке! Тоді бажання продовжувати стає менше . Але в такі моменти я Зразу відхожу від пк і йду гуляти, читати або займатись спортом і потім знову приступаю . Короче , зникає бажання від того коли я не можу вирішити важку задачу
dianosauric Рівень 42
22 вересня 2022
Особисто для себе бачу великий + в складних задачах: вони стимуюють мозок більше думати і шукати вирішення ще й в додаткових джерелах. І скільки потім допаміну від того, що вдалося ці кляті складні задачі вирішити, най їм грець
dianosauric Рівень 42
22 вересня 2022
при складнощах кожен 1-ий може здатися, а ти спробуй далі йти. Можеш питання по задачам в особисті повідомлення задавати. Зможу попояснювати їх детальніше
Neridnyi Taras Рівень 23
22 вересня 2022
Дякую за запропоновану допомогу) Як щось не вийде буду запитувати.)
Василь Рівень 4
11 липня 2023
Ви за рік стали випускником курсу? Як далі? Як з пошуком роботи?