JavaRush /Курсы /Java Syntax Pro /Коллекции в Java: ArrayList

Коллекции в Java: ArrayList

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

1. Класс ArrayList

Сегодня мы изучим класс ArrayList. Это первый класс из так называемых коллекций. Коллекции в Java — настолько обширная и полезная вещь, что ей посвящен целый квест на JavaRush.

Чтобы полностью понять, как устроены коллекции и все нюансы их работы, нужно сначала изучить ООП, интерфейсы, наследование, азы многопоточности и многое другое.

Поэтому сегодня мы просто познакомимся с самой простой коллекцией. Зато на достаточно глубоком уровне, чтобы вы понимали, как ей пользоваться и как она работает. Итак, встречайте: коллекция ArrayList.

Предыстория

Начну с небольшой предыстории. Программистам очень не нравилось одно свойство массива — его размер нельзя изменять. Что делать, если нужно сохранить в массиве ещё три элемента, а свободное место только одно?

Единственным решением проблемы нехватки места в массиве было создание массива очень большого размера, чтобы все элементы туда точно поместились. Но это часто приводило к нерациональному расходу памяти. Если обычно в массиве хранилось два-три элемента, но был хотя бы мизерный шанс, что там их будет 100, приходилось создавать массив на 100 элементов.

И что же придумали программисты? Они написали класс ArrayList (массив-список), который выполнял ту же работу, что и Array (массив), но мог изменять свой размер.

Класс ArrayList

Само название ArrayList происходит из двух слов: Array + List. Array — это массив, а List — список.

Внутри каждого объекта типа ArrayList хранится обычный массив элементов. Когда вы считываете элементы из ArrayList, он считывает их со своего внутреннего массива. Когда записываете — записывает их во внутренний массив.

У класса ArrayList отсутствуют все недостатки, которые есть у массивов. Он умеет:

  • Хранить элементы определенного типа
  • Динамически менять размер списка
  • Добавлять элементы в конец списка
  • Вставлять элементы в начало и середину списка
  • Удалять элементы из любого места списка

Подробнее — ниже:


2. Создание объекта ArrayList

Чтобы создать объект класса ArrayList, нужно написать код типа:

ArrayList<Тип> имя = new ArrayList<Тип>();

Где ArrayList — это тип/класс коллекции, Тип — это тип элементов, которые хранит коллекция ArrayList, а имя — это имя переменной типа ArrayList<Тип>.

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

Примеры:

Код Описание
ArrayList<Integer> list = new ArrayList<Integer>();
Список целых чисел
ArrayList<String> list = new ArrayList<String>();
Список строк
ArrayList<Double> list = new ArrayList<Double>();
Список вещественных чисел

Коллекции, в отличие от массивов, не могут хранить примитивные типы: только типы-классы. Поэтому если вам нужна коллекция с типом int, используйте вместо него тип-обертку — Integer.


3. Операции с ArrayList

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

Более подробно можно узнать о методах класса ArrayList из таблицы:

Методы Описание
void add(тип value)
Добавляет в список переданный элемент
void add(int index, тип value)
Добавляет элемент в определенное место списка.
тип get(int index)
Возвращает элемент, который находится под номером index
void set(int index, тип value)
Меняет значение элемента с номером index на value
тип remove(int index)
Удаляет элемент под номером index. Возвращает удаленный элемент.
boolean remove(тип value)
Удаляет элемент: нужно передать сам элемент в список. Если таких элементов несколько, будет удален первый из них.
void clear()
Очищает список — удаляет все элементы из списка.
boolean contains(тип value)
Проверяет, содержится ли в списке элемент value.
boolean isEmpty()
Проверяет, пустой список или нет. Равна ли длина списка нулю.
int size()
Возвращает размер списка — количество элементов списка.
тип[] toArray(тип[] array)
Возвращает массив, содержащий те же элементы, что и список.
Массив нужно передать в метод.

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



4. Сравнение ArrayList и Array

Думаю, без сравнения ArrayList и массива нам не обойтись.

Фактически у массива есть всего 4 действия:

  • Создание массива
  • Получение элемента по номеру
  • Установка элемента по номеру
  • Получение длины массива

Вот аналоги этих операций в массиве и в ArrayList:

Массив ArrayList
String[] array = new String[10];
ArrayList<String> list = new  ArrayList<String>();
String s = array[0];
String s = list.get(0);
array[0] = "Пока";
list.set(0, "Пока");
int count = array.length;
int count = list.size();

Давайте сравним работу ArrayList с работой массива. Для примера решим такую задачу «ввести 10 строк с клавиатуры и вывести их на экран в обратном порядке»

Используем Array (массив) Используем ArrayList
Scanner console = new Scanner(System.in);

// ввод строк с клавиатуры
String[] list = new String[10];

for (int i = 0; i < list.length; i++)
{
    String s = console.nextLine();
    list[i] = s;
}

// вывод содержимого массива на экран
for (int i = 0; i < list.length; i++)
{
    int j = list.length - i - 1;
    System.out.println(list[j]);
}
Scanner console = new Scanner(System.in);

// ввод строк с клавиатуры
ArrayList<String> list = new ArrayList<String>();

for (int i = 0; i < 10; i++)
{
    String s = console.nextLine();
    list.add(s);
}

// вывод содержимого коллекции на экран
for (int i = 0; i < list.size(); i++)
{
    int j = list.size() - i - 1;
    System.out.println(list.get(j));
}

В принципе можно провести четкую аналогию. Причем в массиве все даже как-то короче и понятнее что-ли. Но и в ArrayList не сильно сложно: получить элемент — метод get(), изменить элемент — метод set(), получить длину списка — метод size().

Так зачем программисты используют класс ArrayList?

Конечно же, все дело в остальных методах, которых у массива нет и не будет:

  • Добавление элемента в список
  • Вставка элемента в середину списка
  • Поиск элемента в списке
  • Удаление элемента из списка

Комментарии (401)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Sergey Fedorov Уровень 16
24 февраля 2026
Из лекции: вывод содержимого массива на экран for (int i = 0; i < list.length; i++) { int j = list.length - i - 1; System.out.println(list[j]); } Не понимаю зачем усложняют авторы, для меня выглядит проще вместо создания в цикле дополнительной переменной, использовать i: for (int i = list.length - 1; i >= 0; i--) { System.out.println(list[i]); } Или я не прав?
hidden #3614201 Уровень 15
19 апреля 2026
Абсолютно правы: код, который они там реализовали, больше содержит математический характер, а тот, который указали вы, воспринимается куда проще)
Семен Уровень 23
16 января 2026
Не понимаю, что за непонятная задача про бухгалтерию... Берем правильное решение от сайта, закидываем его в ИДЕА, после метода initEmployees(); применяем логирование: System.out.println(waitingEmployees.toString()); System.out.println(alreadyGotSalaryEmployees.toString()); Вывод: [Гвинно, Гунигерд, Боргелейф, Нифрод, Альбиуф, Иногрим, Фриле] [] Я вообще не понял...почему в правильном решении нигде не "включается" метод: paySalary(String)? Мы вручную должны в методе main : paySalary("Имярек") ?? короче кипит мой разум возмущенный.... поясните?
Bohdan Уровень 1
19 января 2026
Метод main в тестировании не участвует
Семен Уровень 23
20 января 2026
в задаче \то не сказано! "//напишите тут ваш код", но ведь код будет принципиально отличаться если имена подаются списком, вручную из списка, сканером?
Grigoryvvv Уровень 18 Expert
11 января 2026
12.01.2026 / 13 уровень Начиная с Java7 при создании объекта ArrayList не обязательно в правой части указывать тип элементов

ArrayList<String> list = new  ArrayList<String>();
Компилятор понимает, что справа тоже должен быть такой-же тип как и в левой части

ArrayList<String> list = new  ArrayList<>();  // то же самое
C0N5P1RACY Уровень 1
18 декабря 2025
Эта тема написана лучше всего, за последние несколько уровней... Прошлые лекции как будто намерено написаны непонятно, а в этой наоборот, все предельно ясно (может просто тема не сложная?...)
yarikk Уровень 30
3 ноября 2025
public static void reverse() { int last = numbers.size()-1; for (int i = 0; i < numbers.size() / 2; i++) { int temp = numbers.get(last-i); int temp2 = numbers.get(i); numbers.set(i, last-i); numbers.set(last-i, temp2); } } а что здесь не так? значения меняет но компилятор все равно крестик дает
Viktoriko Уровень 20
21 ноября 2025
Вот здесь не совсем корректно

numbers.set(i, last-i);
В данном примере ошибки не будет видно, так как заполнение идёт цифрами, равными индексам массива, если массив заполнить чем то иным, то видна будет разница. В метод set(int index, тип value) - первым аргументом надо передать индекс элемента в коллекции вместо которого будет второй аргумент. То есть вторым аргументом передается значение, а это может быть String, Boolean, Integer, Double и любой другой тип, который соответствует типу коллекции. У Вас же в примере
last - i
- является индексом, а не значением.
Anonymous #3605187 Уровень 14
11 сентября 2025
😎😎изи
REK.QA Уровень 4
10 августа 2025
Что такое indexOf(name) в первой задаче мы, по традиции, узнаем в одной из следующих лекций?
Paul Уровень 32
27 августа 2025
Метод indexOf(), как и любой другой можно спокойно найти в официальной документации oracle по классу ArrayList. Первая ссылка в гугле
Anonymous #3611806 Уровень 24
18 сентября 2025
Классика, какой гений так решил задачки распределять ладно если бы еще в ходе самостоятельной работы дали намек, а затем вовсе не раскрывали что это и для чего , а когда нам после задачки еще в след лекции про это рассказывают в 2 словах = выглядит странно
Anonymous #3585174 Уровень 33
29 июня 2025
like
Alena Kavaleuskaya Уровень 16
27 июня 2025
Коллекции в Java — настолько обширная и полезная вещь, что ей посвящен целый квест на JavaRush. -А где их найти и как проходить? Может кто-то подсказать?
4el0vek3 Уровень 40
13 июля 2025
Java Collections это отдельный квест, который будет доступен после достижения 30го уровня, состоит он из 11 уровней
T V Уровень 33
12 февраля 2025

public static void initEmployees() {
        waitingEmployees.add("Гвинно");
        waitingEmployees.add("Гунигерд");
        waitingEmployees.add("Боргелейф");
        waitingEmployees.add("Нифрод");
        waitingEmployees.add("Альбиуф");
        waitingEmployees.add("Иногрим");
        waitingEmployees.add("Фриле");
В 911году в Византию послы гоняли мир заключать, похоже это им командировочные бухгалтерия начисляла. Из текста договора: Мы от рода русского — Карлы, Инегелд, Фарлаф, Веремуд, Рулав, Гуды, Руалд, Карн, Фрелав, Руар, Актеву, Труан, Лидул, Фост, Стемид — посланные от Олега, великого князя русского, и от всех, кто под рукою его
empty Уровень 21
19 апреля 2025
Несколько удобных способов инициализировать лист: (те которые я помню) без учета list.add(...) List<String> list = new ArrayList(List.of("Гвинно", "Гунигерд", "и т.д.")); List<String> list = List.of("Гвинно", "Гунигерд", "и т.д."); List<String> list = new ArrayList<>(); Collections.addAll(list, "Гвинно", "Гунигерд", "и т.д."); List<String> list = Arrays.asList("Гвинно", "Гунигерд", "и т.д."); List<String> list = Stream.of("Гвинно", "Гунигерд", "и т.д.").toList(); List<String> list = new ArrayList<>(Arrays.asList("Гвинно", "Гунигерд", "и т.д.")); Разница между ними есть, в гибкости. Какие то изменяемые какие то нет.