JavaRush /Курсы /Java Syntax Pro /Вспомогательный класс Arrays

Вспомогательный класс Arrays

Java Syntax Pro
5 уровень , 6 лекция
Открыта

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 (содержимое массивов равно)


Комментарии (280)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
1 октября 2025
Deep penetration был когда начал изучать массивы
Entropie Уровень 8
25 сентября 2025
Только мне кажется, что в материале ошибка? : "String str = имя.toString(); Где имя — это имя переменной-массива, а str — это имя переменной, в которую сохранится строковое представление массива." Так же вроде должно быть: "String str = Arrays.toString(имя);" ???
Horror Уровень 6
6 сентября 2025
Потихоньку продолжаю изучать java. Целую неделю приходил после работы и бился над решением поставленной самим себе задачи по написанию консольного варианта игры "крестики-нолики". Господи, если бы я знал, что можно будет сравнивать массивы, то не создавал бы огромный if { } else if блок проверки линий.. Если кто захочет повторить мой опыт, то создаёте String[][] ticTac = new String[3][3]; Заполняете ticTac[x][y] через двойной цикл for кватдратными скобками с пробелом "[ ]". координаты крестика или нолика будете вводить со сканера и заносить это значение в ticTac[x][y] по координатам. Пока кажется всё легко? Но теперь нужно выявить победителя, а проверку проводить каждый ход... НЕ ПОВТОРЯЙТЕ МОЕЙ ОШИБКИ. Я реально потратил неделю(хотя в часах 12 - 14 ну плюс мыслительный процесс как это всё скомпилировать) Все 8 возможных линий победы, МОЖНО ЗАПИХАТЬ В ЕЩЁ ОДИН МАССИВ, а сравнивать массивы учат в конце этой главы. Вот как тут кукухой не поехать?😵 нифига сегодня не спал, ноги вообще не держат, но код стал меньше и игра работает... Рекомендую всем поломать голову над решением этой задачи.
Entropie Уровень 8
25 сентября 2025
Я за игры 5+ уровня буду браться на 9-10 уровне, чтобы не попасть в вашу ситуацию XD
paramonov.iv Уровень 6
29 сентября 2025
Скажите пожалуйста, где найти задания на написание игры? В уровне 20 "Задачи-игры на JavaRush"? В таком случае нужно будет открыть первые две лекции из этого блока досрочно, верно?
RomZed Уровень 10
14 августа 2025
Кто тоже подумал что сейчас будет про ArrayList?
Anton Zorin Уровень 20
14 августа 2025
Сами массивы понять не сложно,хитрые задачи с массивами - это просто вы**** мозга, сколько к ним не возвращайся и как глубоко не знай язык.
Gris Hiver Уровень 1
3 августа 2025
Знатоки, подскажите. Уже который раз встречаю в лекции термин «ссылка» в качестве адреса объекта в памяти. То есть в Java указатель называют «ссылкой»? Или ориентироваться на понятие ссылки из С++?
Anton Zorin Уровень 20
14 августа 2025
✅ Ссылки в Java — это "безопасные указатели" с автоматическим управлением памятью, без арифметики и явного разыменования. ❌ Нет прямого доступа к памяти (как в C++), но зато нет и утечек памяти или висячих ссылок.
Nova Уровень 7
5 июля 2025
Рад что я не единственный кто на очень долго застрял на этих *ъуъ* массивах и все же добрался сюда и почувствовал облегчение, я вечно ждал какой-то подвох от заданий , вечно казалось что я что то делаю не так, но нет с первого раза всё делалось!
Alexey Ulov Уровень 16
30 июня 2025
Поставьте лайк пожалуйста для достижения.
15 июня 2025
"Переменная str будет содержать строковое значение:"[1, 2, 3]" - нет, не будет, компилятор выдаст ошибку. deepToString допускается только для многомерных массивов.
Katakuri Charlotte Уровень 16
6 октября 2025
Нет, все будет работать нормально, пример показан на массиве Integer, у которого каждая ячейка хранит адрес на объект
Anonymous #3585174 Уровень 33
4 июня 2025
goog