🔥 🚀 Важно для всех, кто работает с Java! 🔥
На JavaRocks ты найдешь уникальные туториалы, практические задачи и редкие книги, которых не найти в свободном доступе. Присоединяйся к нашему Telegram-каналу JavaRocks — стань частью профессионального сообщества!
Эта статья поможет вам разобраться, зачем нужен класс Arrays и как работать с массивами в Java. Вы можете выбрать удобный для вас формат — посмотреть видеоурок на английском языке, либо же прочитать текстовую версию ниже.
Разберем несколько задач и примеров работы с массивами, которые часто встречаются на практике.
Например, представьте, что есть массив из 10 случайных чисел:
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};Задача — отсортировать этот массив по возрастанию: от наименьшего к наибольшему.
В итоге должно получиться так:
[-234, -2, 16, 26, 35, 43, 92, 99, 167]
Как это сделать?
Задача на самом деле не из простых.
Для начала попробуйте догадаться самостоятельно, как ее решить.
Вот одно из решений:
- Проходим по массиву и сравниваем элементы попарно ([0] с [1], [1] с [2], [2] с [3] и т. д.). Если текущий элемент больше следующего — меняем их местами. Если нет — оставляем как есть и переходим дальше.
- Таким образом, после первого прохода самое большое значение (в нашем случае — 167) окажется в последней ячейке массива.
- Теперь повторяем то же самое, но уже не до самого конца, а до предпоследнего элемента — ведь последний уже на своем месте. В результате второго прохода на предпоследнем месте окажется следующее по величине значение — 99.
- Повторяем этот процесс столько раз, сколько элементов массива — так получим отсортированный массив.
Суть понятна. Теперь осталось только написать код. Вот как это может выглядеть:

public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
for (int i = numbers.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
/* Compare the elements in pairs.
If they are not in the right order,
then swap them */
if (numbers[j] > numbers[j + 1]) {
int tmp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = tmp;
}
}
}
}
}Run CodeДаже если общий принцип понятен, все равно придется написать довольно много кода для решения такой простой задачи.
Давайте попробуем что-нибудь попроще.
Например, возьмем тот же массив чисел.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};Наша задача — скопировать его содержимое в другой массив.
int [] numbersCopy = new int[10];Подумайте, как бы вы это сделали, используя то, что вы уже знаете о массивах?
Например, можно пройтись по массиву numbers в цикле и поочерёдно записывать его элементы в numbersCopy:
public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
int [] numbersCopy = new int[10];
for (int i = 0; i < numbers.length; i++) {
numbersCopy[i] = numbers[i];
}
}
}Run CodeПохоже, мы справились и задача решена! Однако если вам придется выполнять подобные действия часто, код быстро заполнят однотипные циклы.
На самом деле, такие рутинные задачи уже давно решены создателями Java. Нет необходимости “изобретать велосипед” и придумывать собственное решение.
Для таких целей существует специальный статический класс — Arrays, который помогает выполнять типовые операции с массивами.
В этот класс добавлены методы для выполнения наиболее распространенных задач, с которыми сталкиваются Java-разработчики.
Методы класса Arrays в Java
Например, задача сортировки массива, с которой мы сейчас пытались справиться, решается всего одной строкой:
public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));
}
}Run CodeМетод Arrays.sort() сортирует массив. И делает это гораздо эффективнее, чем написанный нами алгоритм.
Вывод в консоли:
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
Примечание: Чтобы преобразовать массив в строку, используется другой метод класса Arrays — Arrays.toString().
В Java массивы по умолчанию не переопределяют метод toString(), поэтому если написать:
System.out.println(numbers.toString());— вызовется метод toString() из класса Object. В итоге вывод будет выглядеть примерно так:
[I@4554617c
Не будем вдаваться в подробности, почему вывод выглядит именно так. Главное, что это явно не то, что нам нужно. А вот Arrays.toString() делает именно то, что требуется.
Кстати, копирование массива также легко выполняется с помощью класса Arrays:
public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
System.out.println(Arrays.toString(numbersCopy));
}
}Run CodeМы передаем методу Arrays.copyOf() исходный массив (из которого хотим скопировать значения) и длину нового массива, в который будут копироваться данные. В данном случае в качестве длины мы указали numbers.length, так как хотим скопировать весь массив целиком. Если же нужно скопировать только несколько первых элементов, можно задать меньшую длину:
public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
int [] numbersCopy = Arrays.copyOf(numbers, 4);
System.out.println(Arrays.toString(numbersCopy));
}
}Run CodeЗдесь в качестве длины указано значение 4, поэтому в новый массив попадут только первые четыре элемента.
Консольный вывод:
[167, -2, 16, 99]
Кстати, Arrays также позволяет копировать часть массива из середины, а не из начала массива:
public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
System.out.println(Arrays.toString(numbersCopy));
}
}Run CodeВывод:
[16, 99, 26, 92]
В новый массив скопированы элементы со второго включительно до шестого не включительно (индексация начинается с нуля).
Иногда также может понадобиться сравнить два массива. Как и в случае с методом toString(), сами массивы не переопределяют метод equals(). Поэтому если мы попытаемся сравнить их следующим образом
public class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
int[] numbers2 = {1, 2, 3};
System.out.println(numbers.equals(numbers2));
}
}Run Codeто мы получим false, поскольку будет вызван метод equals() из класса Object, который сравнивает ссылки на объекты, а не их содержимое.
Класс Arrays содержит переопределенный метод equals(), который сравнивает массивы по содержимому:
public class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
int[] numbers2 = {1, 2, 3};
System.out.println(Arrays.equals(numbers, numbers2));
}
}Run CodeВывод:
true
Кстати, класс Arrays работает не только с обычными массивами, но и с двумерными:
public class Main {
public static void main(String[] args) {
int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);
System.out.println("Are these two-dimensional arrays equal?");
System.out.println(Arrays.deepEquals(numbers, numbersCopy));
System.out.println(Arrays.deepToString(numbersCopy));
}
}Run CodeВывод:
Are these two-dimensional arrays equal?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Как видите, метод Arrays.copyOf() успешно скопировал двумерный массив. Для сравнения и отображения двумерных массивов в классе есть специальные методы: deepEquals() и deepToString().
В дальнейшем вы не раз убедитесь и порадуетесь, что создатели Java предусмотрели множество ситуаций, с которыми часто сталкиваются программисты, и реализовали готовые решения для них. Использовать их проще и удобнее, чем разрабатывать собственные алгоритмы.
Рекомендуем также изучить документацию по классу Arrays на сайте Oracle. Удачи в изучении!
Перевод статьи «Arrays Class in Java».
