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 (вміст масивів однаковий) |