Класс Arrays
Класс Arrays из пакета java.util собирает готовые методы для работы с массивами: вывод, сортировку, заполнение, копирование и сравнение. Пакет — это группа связанных классов. В короткой форме программы java.util подключён автоматически, а в классической нужна строка import java.util.Arrays;.
toString
Arrays.toString() превращает массив в читаемую строку. Он нужен в каждом примере ниже, чтобы увидеть результат:
void main() {
String[] cities = {"Рим", "Париж", "Берлин"};
IO.println(Arrays.toString(cities));
}Результат:
[Рим, Париж, Берлин]sort
Arrays.sort() сортирует массив по возрастанию. Он меняет сам массив и ничего не возвращает. Строки сортируются по алфавиту:
void main() {
int[] prices = {40, 15, 99, 3};
Arrays.sort(prices);
IO.println(Arrays.toString(prices));
String[] names = {"Олег", "Анна", "Мария"};
Arrays.sort(names);
IO.println(Arrays.toString(names));
}Результат:
[3, 15, 40, 99]
[Анна, Мария, Олег]Чтобы отсортировать в другом порядке, например по убыванию или по длине строки, нужен компаратор — о нём урок о сортировке коллекций.
fill
Arrays.fill() записывает одно значение во все элементы массива. Удобно, когда значение по умолчанию не подходит:
void main() {
char[] line = new char[10];
Arrays.fill(line, '-');
IO.println(new String(line));
}Результат:
----------new String(line) собирает строку из массива символов. Есть и версия для части массива: Arrays.fill(line, 0, 3, '*') заполнит только индексы с 0 по 2.
Копирование
Длину массива изменить нельзя, но можно сделать копию нужного размера. Arrays.copyOf() берёт начало массива и дополняет копию значениями по умолчанию, если она длиннее. Arrays.copyOfRange() копирует отрезок от индекса включительно до индекса не включительно:
void main() {
int[] numbers = {1, 2, 3, 4, 5};
IO.println(Arrays.toString(Arrays.copyOf(numbers, 3)));
IO.println(Arrays.toString(Arrays.copyOf(numbers, 7)));
IO.println(Arrays.toString(Arrays.copyOfRange(numbers, 1, 4)));
}Результат:
[1, 2, 3]
[1, 2, 3, 4, 5, 0, 0]
[2, 3, 4]Исходный массив при этом не меняется.
Сравнение и поиск
Arrays.equals() сравнивает массивы поэлементно. Arrays.binarySearch() быстро находит индекс значения, но только в отсортированном массиве:
void main() {
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
IO.println(Arrays.equals(a, b));
int[] sorted = {10, 20, 30, 40};
IO.println(Arrays.binarySearch(sorted, 30));
}Результат:
true
2Если значения нет, binarySearch() возвращает отрицательное число.
Частая ошибка
Массивы нельзя сравнивать через == или метод equals() самого массива. Оба проверяют, один ли это объект, а не одинаковое ли содержимое:
void main() {
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
IO.println(a == b);
IO.println(a.equals(b));
IO.println(Arrays.equals(a, b));
}Результат:
false
false
trueДля сравнения содержимого всегда используйте Arrays.equals(), а для двумерных массивов — Arrays.deepEquals().