— Амиго, я надеюсь, ты уже понял, насколько полезны массивы в программировании?

— Естественно, Риша! Не одну задачу уже решил.

— А в твоих задачах были повторяющиеся действия? Такие, которые ты проделывал снова и снова.

— Если я тебя правильно понял, ты имеешь в виду похожие действия в разных задачах? Ну вот, например, везде вывод массива через цикл — прямо надоело это делать!

— Да, я именно об этом. Вот и создатели Java заметили, что Java-программисты часто пишут один и тот же код при работе с массивами. Например, «скопировать часть массива в другой массив», «заполнить все ячейки массива одинаковыми значениями». Или твой пример: «вывести содержимое массива в удобно читаемом виде на экран».

— А у настоящих программистов есть одно очень важное правило: «не повторяйся». Согласись, неправильно делать лишнюю работу, за неё тебе не заплатят. Платят за эффективную, уж поверь. Кстати, код зелёного новичка сразу узнают по большому количеству повторов.

— Подумали создатели Java, и разработали специальный класс – Arrays (полное имя java.util.Arrays), в который поместили самые популярные действия при работе с массивами.

— Хм… Интересно-интересно. И что же в нём такого?

— В нем очень много методов на все случаи жизни, но для начала мы рассмотрим только 10 из них — самые простые и часто используемые.

Метод 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 будет содержать строковое значение "[Привет, Как, Дела]"
undefined
6
Задача
Java Syntax Pro, 6 уровень, 7 лекция
Недоступна
Выводим массивы
Реализуй метод main(String[]), который выводит массивы strings и ints в консоли с помощью метода Arrays.toString().

Метод Arrays.deepToString()

— Однако метода toString() не хватит, если речь идёт о двумерных массивах. То есть если ты попробуешь вызвать Arrays.toString(), то увидишь кое-что знакомое:

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

— А все дело в том, что в ячейках двумерного массива хранятся ссылки на одномерные массивы. А одномерные массивы как преобразовываются в строку? Именно так, как ты видишь выше.

— Что же делать тогда? Как нам получить правильное отображение двумерного массива?

— Творцы Java и это предусмотрели. Для этого у класса Arrays есть еще один специальный метод — deepToString(). Вызов его выглядит так:

String str = Arrays.deepToString(имя);

— В этот метод можно передать двумерный, одномерный, трехмерный и вообще массив любой размерности, и он всегда будет отображать элементы массива.

Примеры:

int[] 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]], [[]]]"
undefined
6
Задача
Java Syntax Pro, 6 уровень, 7 лекция
Недоступна
Выводим двумерные массивы
Реализуй метод main(String[]), который выводит массивы strings и ints в консоли c помощью метода Arrays.deepToString(Object[][]).

Метод Arrays.equals()

— С выводом массивов на экран разобрались. А что насчет сравнения массивов? Ты помнишь, какие методы мы можем использовать для сравнения строк?

— Я обычно использую метод equals!

— Да, equals, и ещё equalsIgnoreCase (который сравнивает строки независимо от строчных и прописных букв).

— Хорошая новость: для массивов тоже можно использовать метод equals. Плохая новость: он не сравнивает содержимое массивов. Метод equals у массивов делает то же самое, что и оператор == – сравнивает ссылки.

Примеры:

int[] x1 = {1, 2, 3};
int[] x2 = {1, 2, 3};
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 (содержимое массивов отличается)

Метод 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 (содержимое массивов равно)
undefined
6
Задача
Java Syntax Pro, 6 уровень, 7 лекция
Недоступна
Сравнение двумерных массивов
Исправь работу метода main(String[]), который выводит в консоли true, если arrayFirst равняется arraySecond, иначе — false.

— Спасибо, Риша! Это та самая лекция, которая сделает мою жизнь проще и приятнее в будущем. Теперь буду пользоваться методами класса Arrays и быстрее писать программы.

— На это я и рассчитывал, хе-хе. Но это ещё не все интересные методы класса Arrays. О других я расскажу тебе в следующий раз.