1. Введение
Массивы в Java — мощный инструмент, но базовый синтаксис быстро упирается в рутину. На помощь приходит класс java.util.Arrays — набор статических методов для работы с массивами: сортировка, копирование, сравнение, форматированный вывод и не только. Экземпляры создавать не нужно — все методы статические и вызываются через имя класса.
Чтобы использовать методы, добавьте импорт в начало файла:
import java.util.Arrays;
Если забыть импорт, компилятор пожалуется, что Arrays «не найден» — это не баг, а ожидаемое поведение без импорта.
2. Сортировка массива: Arrays.sort
Как работает Arrays.sort
Синтаксис
Arrays.sort(массив);
Arrays.sort(массив, начальныйИндекс, конечныйИндекс);
Метод сортирует «на месте» — изменяет исходный массив и не возвращает новый. Хотите сохранить оригинальный порядок? Сначала скопируйте массив.
Пример: сортировка массива целых чисел
int[] scores = {5, 2, 9, 1, 7};
Arrays.sort(scores); // Сортируем по возрастанию
System.out.println("Отсортированный массив: " + Arrays.toString(scores));
// Выведет: [1, 2, 5, 7, 9]
Пример: сортировка массива строк
String[] names = {"Вася", "Петя", "Аня", "Игорь"};
Arrays.sort(names);
System.out.println(Arrays.toString(names));
// [Аня, Вася, Игорь, Петя]
Важно: строки сортируются лексикографически (по алфавиту), числа — по возрастанию.
Сортировка части массива
int[] arr = {7, 5, 3, 1, 9, 8};
Arrays.sort(arr, 1, 4); // сортирует элементы с индекса 1 до 3 включительно (4 не включается)
System.out.println(Arrays.toString(arr));
// [7, 1, 3, 5, 9, 8]
Особенности
- Сортировка «на месте»: исходный массив меняется.
- Числа — по возрастанию, строки — по алфавиту.
- Для сложных объектов используйте перегрузки с компаратором.
3. Заполнение массива: Arrays.fill
Синтаксис
Arrays.fill(массив, значение);
Arrays.fill(массив, начальныйИндекс, конечныйИндекс, значение);
Метод заполняет все элементы или указанную часть массива одним и тем же значением.
int[] marks = new int[5];
Arrays.fill(marks, 3); // Все элементы теперь равны 3
System.out.println(Arrays.toString(marks)); // [3, 3, 3, 3, 3]
Заполнение части массива
int[] arr = new int[10];
Arrays.fill(arr, 2, 5, 7); // Заполнит элементы с индекса 2 до 4 включительно (5 не включается)
System.out.println(Arrays.toString(arr));
// [0, 0, 7, 7, 7, 0, 0, 0, 0, 0]
Заполнение массива строк
String[] guests = new String[4];
Arrays.fill(guests, "Пусто");
System.out.println(Arrays.toString(guests)); // [Пусто, Пусто, Пусто, Пусто]
4. Копирование массива: Arrays.copyOf и Arrays.copyOfRange
Arrays.copyOf
Синтаксис
Arrays.copyOf(исходныйМассив, новаяДлина);
Создаёт новый массив и копирует элементы из исходного. Если новая длина больше исходной, «хвост» заполняется значениями по умолчанию (0 для int, null для ссылочных).
int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, 5);
System.out.println(Arrays.toString(copy)); // [1, 2, 3, 0, 0]
Уменьшение массива
int[] shortCopy = Arrays.copyOf(original, 2);
System.out.println(Arrays.toString(shortCopy)); // [1, 2]
Arrays.copyOfRange
Синтаксис
Arrays.copyOfRange(исходныйМассив, начальныйИндекс, конечныйИндекс);
int[] arr = {10, 20, 30, 40, 50};
int[] mid = Arrays.copyOfRange(arr, 1, 4); // Скопирует элементы с индекса 1 по 3
System.out.println(Arrays.toString(mid)); // [20, 30, 40]
5. Сравнение массивов: Arrays.equals и Arrays.deepEquals
В Java нельзя сравнивать массивы через == — так сравниваются ссылки, а не содержимое:
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a == b); // false!
Как сравнивать содержимое?
Arrays.equals(массив1, массив2);
Arrays.deepEquals(матрица1, матрица2);
System.out.println(Arrays.equals(a, b)); // true
Для одномерных массивов используйте Arrays.equals, для двумерных и глубже — Arrays.deepEquals.
Пример: сравнение двумерных массивов
int[][] matrix1 = {{1, 2}, {3, 4}};
int[][] matrix2 = {{1, 2}, {3, 4}};
System.out.println(Arrays.equals(matrix1, matrix2)); // false!
System.out.println(Arrays.deepEquals(matrix1, matrix2)); // true
6. Красивый вывод массива: Arrays.toString и Arrays.deepToString
Прямой вывод массива даст нечитабельную строку:
int[] arr = {1, 2, 3};
System.out.println(arr); // [I@7a81197d
Синтаксис
Arrays.toString(массив);
Arrays.deepToString(матрица);
System.out.println(Arrays.toString(arr)); // [1, 2, 3]
int[][] matrix = {{1, 2}, {3, 4}};
System.out.println(Arrays.deepToString(matrix)); // [[1, 2], [3, 4]]
7. Типичные ошибки при работе с классом Arrays
Ошибка №1: попытка сравнить массивы через ==
Массивы — объекты, и == сравнивает только ссылки. Даже при одинаковых значениях результат будет false. Используйте Arrays.equals (для одномерных) или Arrays.deepEquals (для многомерных).
Ошибка №2: забыли, что сортировка меняет массив «на месте»
Если нужен исходный порядок, сначала сделайте копию Arrays.copyOf, а уже потом сортируйте копию. Иначе оригинал потеряет свой порядок.
Ошибка №3: неверное понимание границ в Arrays.fill и Arrays.copyOfRange
Методы используют полуоткрытый диапазон: правый индекс не включается. Например, Arrays.fill(arr, 2, 5, 9) заполнит индексы 2, 3, 4, а элемент с индексом 5 не тронет.
Ошибка №4: попытка вывести массив напрямую
Вызов System.out.println(arr) печатает техническое представление. Используйте Arrays.toString для одномерных и Arrays.deepToString для многомерных массивов.
Ошибка №5: сравнение многомерных массивов через Arrays.equals
Метод сравнивает только верхний уровень (ссылки на внутренние массивы). Для содержимого используйте Arrays.deepEquals.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ