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?

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

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

Комментарии (396)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Grigoryvvv Уровень 13 Expert
11 января 2026
12.01.2026 / 13 уровень Начиная с Java7 при создании объекта ArrayList не обязательно в правой части указывать тип элементов

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

ArrayList<String> list = new  ArrayList<>();  // то же самое
C0N5P1RACY Уровень 21
18 декабря 2025
Эта тема написана лучше всего, за последние несколько уровней... Прошлые лекции как будто намерено написаны непонятно, а в этой наоборот, все предельно ясно (может просто тема не сложная?...)
yarikk Уровень 17
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 Уровень 19
21 ноября 2025
Вот здесь не совсем корректно

numbers.set(i, last-i);
В данном примере ошибки не будет видно, так как заполнение идёт цифрами, равными индексам массива, если массив заполнить чем то иным, то видна будет разница. В метод set(int index, тип value) - первым аргументом надо передать индекс элемента в коллекции вместо которого будет второй аргумент. То есть вторым аргументом передается значение, а это может быть String, Boolean, Integer, Double и любой другой тип, который соответствует типу коллекции. У Вас же в примере
last - i
- является индексом, а не значением.
Anonymous #3605187 Уровень 2
11 сентября 2025
😎😎изи
REK.QA Уровень 4
10 августа 2025
Что такое indexOf(name) в первой задаче мы, по традиции, узнаем в одной из следующих лекций?
Paul Уровень 25
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 Уровень 36
13 июля 2025
Java Collections это отдельный квест, который будет доступен после достижения 30го уровня, состоит он из 11 уровней
Trofim Veselov Уровень 30
12 февраля 2025

public static void initEmployees() {
        waitingEmployees.add("Гвинно");
        waitingEmployees.add("Гунигерд");
        waitingEmployees.add("Боргелейф");
        waitingEmployees.add("Нифрод");
        waitingEmployees.add("Альбиуф");
        waitingEmployees.add("Иногрим");
        waitingEmployees.add("Фриле");
В 911году в Византию послы гоняли мир заключать, похоже это им командировочные бухгалтерия начисляла. Из текста договора: Мы от рода русского — Карлы, Инегелд, Фарлаф, Веремуд, Рулав, Гуды, Руалд, Карн, Фрелав, Руар, Актеву, Труан, Лидул, Фост, Стемид — посланные от Олега, великого князя русского, и от всех, кто под рукою его
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("Гвинно", "Гунигерд", "и т.д.")); Разница между ними есть, в гибкости. Какие то изменяемые какие то нет.
Victor Уровень 38
23 января 2025
Что за имена в первой задаче "Бухгалтерия" странные - Гвинно, Гунигерд, Боргелейф, Нифрод, Альбиуф, Иногрим, Фриле. Из какой-то игры что ли.
player Уровень 24
5 февраля 2025
Эти имена выглядят как стилизованные под древнескандинавские, германские или кельтские. Они не принадлежат какой-то популярной франшизе, но могут быть вдохновлены историческими именами. 🔍 Разбор имен: Гвинно — похоже на валлийское (кельтское) имя, возможно, связано с корнем Gwyn (белый, чистый). Гунигерд — напоминает древнегерманские имена с элементами -герд (герд, стража, защита). Боргелейф — звучит как скандинавское имя, -лейф означает "наследник". Нифрод — может быть придумано, но звучит как смесь древнескандинавского (Nifl- означает "туман", как в Niflheim). Альбиуф — может происходить от Albi- (светлый, эльфийский) и -уф (фонетически похоже на "ульф" — волк). Иногрим — напоминает германские имена, -грим (grim) означает "суровый" или "маска". Фриле — напоминает староскандинавское имя, но точного аналога нет. 🧐 Возможные источники вдохновения: Скандинавская мифология (имена похожи на древнескандинавские). Германские и кельтские имена (например, Гвинно — похож на валлийские имена). Фэнтези-литература (но не известные персонажи из Tolkien, Warhammer, D&D и т. д.). Придуманные имена в стилистике средневековой Европы.
Сержик Бурчо Уровень 8
23 октября 2025
Скайрим для Нордов! 👹
SUNSHINE Уровень 14
16 декабря 2025
По-моему все в Средиземье Толкиена встречаются ;)
Артемий Уровень 23
22 января 2025
Для пузырька достаточно заменить всё на одну строчку

public static void sort() {
        Arrays.sort(numbers);
    }
кроме корректировки объявления numbers конечно же
Денис Кокшаров Уровень 1
29 января 2025
не умничай)
19 апреля 2025
Там quick sort под капотом для примитивов и merge для объектов, разве нет? ;)