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(ім'я);
Приклади:
|
Змінна str міститиме строкове значення: |
|
Змінна str міститиме строкове значення: |
|
Змінна str міститиме строкове значення: |
3. Метод Arrays.deepToString()
Але якщо ти за допомогою методу Arrays.toString() спробуєш перетворити в рядок (вивести на екран) двовимірний масив, побачиш щось знайоме:
[I@37afeb11, I@37afeb21, I@37afeb31]
Уся справа в тому, що в комірках двовимірного масиву зберігаються посилання на одномірні масиви. А як одномірні масиви перетворюються на рядок? Саме так, як ти бачиш вище.
І що ж робити? Як отримати правильне відображення двовимірного масиву?
Для цього у класу Arrays є ще один спеціальний метод — deepToString(). Виклик його виглядає так:
String str = Arrays.deepToString(ім'я);
У цей метод можна передати двовимірний, одномірний, тривимірний і взагалі масив будь-якої розмірності, і він завжди буде відображати елементи масиву.
Зверни увагу: метод Arrays.deepToString() не працює з одномірними масивами примітивів (наприклад, int[]).
Приклади:
|
Змінна str буде містити рядкове значення: |
|
Змінна str буде містити рядкове значення: |
|
Змінна str буде містити рядкове значення: |
4. Метод Arrays.equals()
З виведенням масивів на екран ми розібралися, а що щодо порівняння масивів?
Для порівняння рядків у нас були методи equals та equalsIgnoreCase, а які методи є у масивів?
Гарна новина: у масивів є метод equals, і погана новина — він не порівнює вміст масивів. Метод equals у масивів робить те саме, що й оператор == – порівнює посилання.
Приклади:
|
false (посилання не рівні) |
|
Метод equals у масивів банально порівнює посилання двох масивів.false (посилання не рівні) |
І що ж робити? Як порівняти масиви за їх вмістом?
І знову нам на допомогу приходить клас Arrays, а точніше, його метод Arrays.equals() Виглядає його виклик так:
Arrays.equals(ім'я1, ім'я2)
Метод повертає true (істина), якщо масиви однакової довжини і їх елементи рівні. Інакше повертає false (хибність).
Приклади:
|
Метод equals у масивів банально порівнює посилання двох масивів.false (посилання не рівні) |
|
true (вміст масивів однаковий) |
|
false (вміст масивів відрізняється) |
5. Метод Arrays.deepEquals()
І як ти вже, мабуть, здогадуєшся, метод Arrays.equals для двовимірних масивів працюватиме неправильно: він працює з двовимірним масивом як з одновимірним, елементи якого — адреси одновимірних масивів.
Тому, щоб правильно порівнювати багатовимірні масиви (n=1, 2, 3, ...), придумали метод Arrays.deepEquals(). Його виклик виглядає так:
Arrays.deepEquals(ім'я1, ім'я2)
Метод повертає true (істина), якщо масиви однакової довжини і їх елементи рівні. Інакше повертає false (хибність). Якщо елементи всередині масиву — теж масиви, для їх порівняння використовується метод Arrays.deepEquals() і т.д.
Приклади:
|
Метод equals у масивів банально порівнює посилання двох масивів.false (посилання не рівні) |
|
Метод Arrays.equals порівняє x1 і x2 як одновимірні масиви, які зберігають посилання. У них зберігаються різні посилання.false (вміст масивів не рівний) |
|
true (вміст масивів рівний) |
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ