JavaRush /Курсы /Java Syntax Pro /Класс Arrays, часть 2

Класс Arrays, часть 2

Java Syntax Pro
5 уровень , 7 лекция
Открыта

1. Метод Arrays.fill()

Очень часто у Java-программистов при работе с массивами возникает задача: заполнить массив одинаковыми значениями. Можно, конечно, написать цикл и просто в цикле присвоить каждой ячейке массива определенное значение:

int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;

А можно просто вызвать метод Arrays.fill(), который делает точно то же самое: заполняет переданный массив переданным значением. Вот как это выглядит:

Arrays.fill(имя, значение)

И код из примера выше можно сделать немного компактнее и понятнее:

int[] x = new int[100];
Arrays.fill(x, 999);

А еще с помощью метода Arrays.fill() можно заполнить определенным значением не весь массив, а его часть:

Arrays.fill(имя, первый, последний, значение)

Где первый и последний — это номера первой и последней ячеек, которые нужно заполнить.

По старой доброй традиции Java, последний элемент не входит в диапазон.

Пример:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);


Заполняем ячейки x[3], x[4], x[5], x[6] значениями 999. Нумерация ячеек массива с нуля!

Переменная str содержит значение:
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

Метод Arrays.fill() работает только с одномерными массивами. Если в него передать двумерный массив, он будет обработан как одномерный, со всеми вытекающими последствиями.



2. Метод Arrays.copyOf()

Как вы уже знаете, размер контейнера массива после его создания поменять нельзя.

А если очень хочется?

Ну, если очень хочется, то можно:

  • Создать новый массив нужной длины
  • Скопировать в него все элементы из первого массива.

Именно это, кстати, и делает метод Arrays.copyOf(). Вот как выглядит его вызов:

тип[] имя2 = Arrays.copyOf(имя, длина);

Этот метод не меняет существующий массив, вместо этого он создает новый массив и копирует в него элементы старого массива.

Если элементы не поместились (длина меньше длины существующего массива), то лишние значения игнорируются.

Если длина нового массива больше длины старого, ячейки заполняются нулями.

Пример:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


Переменная str2 содержит значение:
"[1, 2, 3, 4, 5]"

Переменная str3 содержит значение:
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

3. Метод Arrays.copyOfRange()

А что делать, если вы хотите получить массив длиной 5 из массива длины 10, но чтобы в нем были не первые 5 элементов, а 5 последних?

Именно для этого случая вам пригодится еще один метод класса Arrays – метод Arrays.copyOfRange() Вот как выглядит его вызов:

тип[] имя2 = Arrays.copyOfRange(имя, первый, последний);

Этот метод тоже создает новый массив, но заполняет его данными из произвольного места исходного массива. Где первый и последний — это номера первой и последней ячеек, которые должны быть в новом массиве.

По старой доброй традиции Java, последний элемент не входит в диапазон.

Пример:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


Переменная str2 содержит значение:
"[16, 17, 18, 19, 20]"

Переменная str3 содержит значение:
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"


4. Метод Arrays.sort()

Ну и самое вкусное — сортировка. В программировании сортировать массивы приходится очень часто. Три самых частых действия при работе с массивами:

  • Сортировка массива
  • Поиск минимального (или максимального) элемента массива
  • Определение индекса элемента в массиве (поиск элемента в массиве)

И именно поэтому разработчики Java включили в класс Arrays метод sort(). Вот как выглядит его вызов:

Arrays.sort(имя);

Этот метод сортирует переданный массив по возрастанию.

Пример:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);

String str = Arrays.toString(x);



Переменная str содержит значение:
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

Отлично, да? Вызвал один метод, и вот у вас еще отсортированный массив. Красота.

Кстати, сортировать можно не только весь массив, но и часть массива. Вот как выглядит его вызов:

Arrays.sort(имя, первый, последний);

Где первый и последний — это номера первой и последней ячеек, которых должна коснуться сортировка.

По старой доброй традиции Java, последний элемент не входит в диапазон.

Пример:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


Переменная str содержит значение:
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

В Java для сортировки массивов используется самый быстрый алгоритм сортировки — QuickSort. Скорость его сортировки зависит от размера массива и рассчитывается по формуле N*Log(N).

Сортировка массива из 1000 элементов будет содержать около 3_000 сравнений ячеек массива. Сортировка массива из миллиона элементов будет содержать около 6 миллионов сравнений.



5. Метод Arrays.binarySearch()

Ну и последний из самых интересных методов класса Arrays умеет искать заданное значение в массиве. Это не обычный поиск, а так называемый бинарный поиск. Суть его заключается вот в чем:

  • Предварительно массив сортируется
  • Затем средний элемент массива сравнивается с искомым (с тем, который мы ищем).
  • Если искомый больше среднего, поиск продолжается в правой половине массива.
  • Если искомый элемент меньше среднего, поиск продолжается в левой половине массива

Благодаря тому, что массив отсортирован, можно за одно сравнение отбросить половину массива. Затем на следующем шаге отбросить еще половину и т.д.

Такой подход делает бинарный поиск очень быстрым. В массиве из миллиона(!) элементов он может найти индекс нужного элемента всего за 20 сравнений. Минусом такого подхода является то, что массив предварительно нужно отсортировать, а сортировка тоже занимает время.

Вот как выглядит его вызов:

int index = Arrays.binarySearch(имя, значение);

Где имя — это имя массива, который нужно передать уже отсортированным (например, с помощью функции Arrays.sort()). значение — это тот элемент, который ищется в массиве. Метод возвращает результат — индекс искомого элемента в массиве (номер ячейки массива).

Примеры:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
x содержит:
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1 (также подходили индексы 0 и 2)
8
-7

Если искомых элементов в массиве несколько, просто вернется номер одного из них (нет гарантий, что это будет, допустим, самый первый или наоборот — самый последний из одинаковых элементов).

Если элемент в массиве не найден, индекс будет отрицательным.



6. Ссылка на Oracle документация по классу Arrays

Если вам очень интересно, полностью информацию про класс Arrays и все его методы вы можете прочитать в официальной документации на сайте Oracle:

https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/util/Arrays.html

Можете почитать, например, про методы Arrays.mismatch() и Arrays.compare(). Может, найдете в них для себя что-нибудь полезное.

И пусть вас не смущает количество методов – там у каждого метода есть 5-10 копий, которые отличаются только типом параметров.



Комментарии (626)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Grigoryvvv Уровень 10 Expert
27 октября 2025
Дополнительно рекомендую ознакомиться с методом System.arraycopy() , который копирует значения из одного массива в другой. Данный метод может работать с массивами любого типа. Он из класса System, и активно используется для работы с массивами и будет встречаться нам начиная с 10 уровня в задачах. Данный класс System находится в пакете java.lang, и его не нужно импортировать — это делается автоматически. Если заглянуть в код метода copyOf(), то выяснится, что внутри себя он вызывает метод arraycopy(). Отличие между этими методами в том, что результатом работы методов копирования из Arrays является массив, который они сами и создают, в то время как для arraycopy() массив должен быть уже создан. Вот как выглядит его вызов:

System.arraycopy(имя1, значение1 , имя2, значение2, длина);
где • имя1: исходный массив, из которого копируются элементы; • значение1: индекс первого элемента в исходном массиве, с которого начнется копирование; • имя2: целевой массив, в который будут вставляться элементы; • значение2: индекс первого элемента в целевом массиве, куда будет вставлен первый элемент; • длина: количество элементов, которое необходимо скопировать; Пример:

int[] a = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
int[] b = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5};
System.arraycopy(a, 2, b, 5, 3);

Итог: массив b будет содержать значения {5, 5, 5, 5, 5, 1, 1, 1, 5, 5};
Дима Уровень 51
17 октября 2025
Коллеги, вот у меня к вам вопрос. Может, у кого-то тоже такая проблема была, как у меня. Вот, допустим, я прочитал лекцию, досконально её изучил, решил задачи к лекции, но я совсем не понимаю, что я могу сделать с этими знаниями, которые здесь получил. Например, я хочу написать веб-приложение. Какой функционал я могу реализовать, используя знания, полученные в данной лекции? Поэтому мне и тяжело учить это всё, потому что я не понимаю, где эти знания я смогу применить. Неужели разработчикам было тяжело написать какое-нибудь приложение, функционал которого они реализовали при помощи этих знаний, которые дают в лекциях, чтобы наглядно показать обучающимся? Ну так намного понятнее было бы. А так я выучил, а для чего — пёс его знает.
Pukidmi Уровень 1
27 октября 2025
Дима психанул и за 10 дней апнулся до 51 уровня.
Дима Уровень 51
7 ноября 2025
Это я уже давно добрался до 51 уровня. Я много раз проходил опросы в конце каждого уровня, чтобы получить материю и открывал лекции не решая задачи. Я хотел добраться до тех лекций где есть соединение консольного кода с графикой, потому что консольные программы мне не понятны. Для того, чтобы я понял, мне нужно видеть результат на экране а не в консоли. К сожалению, моё обучение ползет слишком медленно. Я читаю лекции, разбираю задачи, бывает даже наизусть задачи учу. Но быстро потом всё забываю из-за абсолютного непонимания того, где я могу это применить.
Семен Уровень 10
10 октября 2025
последняя задача - не зачет, почему? public class Solution { public static int[] array = {9, 8, 7, 6, 5, 4, 3, 2, 1}; public static int element = 9; public static void main(String[] args) { //напишите тут ваш код boolean flag = false; int[] array = {9, 8, 7, 6, 5, 4, 3, 2, 1}; int [] arraySort = Arrays.copyOf(array, array.length); Arrays.sort(arraySort); int i = Arrays.binarySearch(arraySort, element); if (i >= 0) { flag = true; } System.out.println(flag); } }
Семен Уровень 10
10 октября 2025
разобрался.. 9 строка - лишняя
Entropie Уровень 8
25 сентября 2025
"Ну и последний из самых интересных методов класса Arrays...", - что же это за метод? "умеет искать заданное значение в массиве.", - поиск номера нужного значения, о, это круто, то, что сильно облегчит мне жизнь. "Это не обычный поиск, а так называемый бинарный поиск", -... окей? "Предварительно массив сортируется", - что, простите? На этой же странице: "В Java для сортировки массивов используется самый быстрый алгоритм сортировки — QuickSort ... Сортировка массива из 1000 элементов будет содержать около 3_000 сравнений ячеек массива." Не проще через цикл и if сделать 1000 сравнений? вместо 3000? И он вообще ищет номер нужного значения в отсортированном массиве, а не в начальном. Весьма и весьма сомнительная польза.
Another Уровень 11
2 октября 2025
Нет, не проще. Сделав через цикл с if 999 сравнений, ты лишь только найдешь максимальный (или минимальный, в зависимости от условия) элемент из 1000, но не отсортируешь весь массив целиком. Почитай про алгоритмы сортировок и ты поймёшь, что не всё так просто 😉
Dmitry Terekhov Уровень 14
18 августа 2025
hard был на уровне лайта...
 
public static void main(String[] args) {

        int a = array.length;
        
        int[] copyArray = Arrays.copyOf(array, a);
        Arrays.sort(copyArray);                             
        a = Arrays.binarySearch(copyArray, element);
        boolean i = a >= 0 ? i = true : false;
        System.out.println(i); 
    }  
 
Anton Zorin Уровень 20
14 августа 2025
После своего налепа и сдачи задачи, нажимайте правильное решение, там как лучше.
hamko17147 Уровень 8
14 августа 2025
public class Solution { public static int[] array = {9, 8, 7, 6, 5, 4, 3, 2, 1}; public static int element = 5; public static void main(String[] args) { //напишите тут ваш код int[] x = Arrays.copyOf(array, array.length); Arrays.sort(x); int index1 = Arrays.binarySearch(x, element); Boolean c = false; for (int i = 0; i < x.length; i++){ if (i == element){ c = true; System.out.println(c); } } } } Подскажите плз, почему не принимает:? пигет нее все условия задачи выполнены...
hamko17147 Уровень 8
15 августа 2025
подскажите, такое решение как вариант имеет место быть? или оно неверно по своей сути?
Zhenya Volkov Уровень 29
12 сентября 2025
для поиска элемента надо использовать метод int index = Arrays.binarySearch(имя массива, элемент)
uki Уровень 16
13 августа 2025
Сделали вспомогательные методы, но так не привычно... где первый элемент - по индексу, а второй по длине, хотя это очень логично
Кот Уровень 19
6 июля 2025
Всё работает, но не принимает. Почему? int a = array.length; int[] yarra = new int[a]; yarra = Arrays.copyOfRange(array, 0, a); Arrays.sort(yarra); int index = Arrays.binarySearch(yarra, 5); boolean C = false; if (index >= 0) C = true; System.out.println(C); } }
Евгений Уровень 11
7 июля 2025
int a = 0; int[] array; array = new int[a]; array = Arrays.copyOfRange(array, 0, a); Arrays.sort(array); int index = Arrays.binarySearch(array, 5); boolean C = false; if (index >= 0) C = true; System.out.println(C);
Кот Уровень 19
23 июля 2025
Так ваще не работает. Так работает: int a = array.length; int[] arraysort = new int[a]; for(int i = 0; i < a; i++) arraysort[i] = array[i]; Arrays.sort(arraysort); int index = Arrays.binarySearch(arraysort, element); boolean C = false; if (index >= 0) C = true; System.out.println(C);
uki Уровень 16
13 августа 2025
Можно сделать чище, постарайтесь избегать лишнего кода, в будущем пригодится )

int[] arr = Arrays.copyOf(array, array.length); // Копия
Arrays.sort(arr); // Отсортированная копия
System.out.println(Arrays.binarySearch(arr, element) >= 0); // Вывод регулярного выражения
Alexey Ulov Уровень 16
30 июня 2025
Поставьте пожалуйста лайк для достижения.