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 (содержимое массивов равно) |
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ