Все разделы
Выбрать школу

Школа. Увлечения. Большое будущее.

PROSCHOOLS · ОБРАЗОВАНИЕ РЯДОМ

Ваш город

Выберите город, чтобы находить образование и возможности рядом.

Как учитываем городКаталог и кнопки «Выбрать школу» покажут школы выбранного города.Онлайн-курсы, учебник, ГДЗ и задания к экзаменам доступны по всей России.

Популярные города

Будет выбран: Вся Россия

Учебные материалы останутся прежними.

Поиск по сайту

По всему сайтуШколы выбранного города — выше в результатах

С чего начнём?

↑ ↓ — выбрать результат · Enter — открыть · Esc — закрыть

java.util.Arrays: сортировка, поиск, копирование и сравнение

💻 Информатика · 10 класс

Практический разбор Arrays.sort, binarySearch, copyOf и equals с ловушкой asList.

Клавиатура в компьютерном классе
Иллюстрация к предмету «Информатика»Hmartil · Wikimedia Commons · CC BY-SA 4.0

Что такое Arrays

java.util.Arrays — служебный класс стандартной библиотеки Java со статическими методами для работы с массивами. Перед использованием обычно пишут import java.util.Arrays;. Массив остаётся массивом фиксированной длины: вызов метода не превращает его автоматически в изменяемый список.

Основные операции

МетодЧто делает
sort(a)Сортирует сам массив a
binarySearch(a, key)Ищет в предварительно отсортированном массиве
copyOf(a, n)Создаёт новый массив длины n
equals(a, b)Сравнивает содержимое одномерных массивов подходящего типа
toString(a)Даёт удобное текстовое представление одномерного массива

Разобранный пример

int[] values = {3, 1, 2};
int[] backup = Arrays.copyOf(values, 5);
Arrays.sort(values);
System.out.println(Arrays.toString(values));
System.out.println(Arrays.toString(backup));
System.out.println(Arrays.binarySearch(values, 2));

Получатся строки [1, 2, 3], [3, 1, 2, 0, 0] и число 1. Сортировка изменила values. Копия создана раньше и хранится отдельно; при увеличении длины новые элементы int заполнены нулями. Индексация начинается с нуля, поэтому число 2 находится по индексу 1.

Если искомого элемента нет, binarySearch возвращает не просто -1, а отрицательное значение, связанное с позицией вставки: -(insertionPoint) - 1. В [1, 2, 3] поиск 4 даст -4, потому что позиция вставки равна 3. При дубликатах метод не обещает найти именно первое вхождение.

Сравнение и диапазоны

Оператор == сравнивает ссылки на массивы. Два отдельных массива [1, 2] могут иметь одинаковые элементы, но разные ссылки; для содержимого нужен Arrays.equals. Для вложенных массивов применяют deepEquals, если требуется сравнение вложенного содержимого.

В диапазонных методах, например copyOfRange(a, from, to), левая граница включается, правая исключается. Это обычная причина ошибки на один элемент. Для Arrays.copyOfRange(new int[]{5, 6, 7}, 1, 3) результат — [6, 7].

Ловушка Arrays.asList

Arrays.asList("a", "b") даёт список фиксированного размера, связанный с переданным массивом; заменить элемент можно, добавить новый — нельзя. А Arrays.asList(new int[]{1, 2}) содержит один элемент типа int[], а не два Integer. Примитивный массив не распаковывается автоматически в список чисел.

Практика

  1. Что выдаст binarySearch для [2, 4, 6] при поиске 5?
  2. Как сравнить два отдельно созданных int[] по элементам?
  3. Чему равен размер Arrays.asList(new int[]{7, 8, 9})?

Ответы

1. -3: позиция вставки 2, значит -2 - 1. Массив должен быть отсортирован. 2. Arrays.equals(a, b), а не a == b. 3. 1: единственный элемент списка — целый примитивный массив.

Перед запуском

Проверьте тип элементов, необходимость копии и предусловия поиска. Документация сверена для Java SE 25; разобранные базовые методы существуют и в более ранних распространённых версиях, однако доступность других перегрузок следует проверять для своего JDK.

Связанные материалы

Источники и материалы