JavaRush /Курсы /Java Syntax Pro /Работа с ArrayList, часть 2

Работа с ArrayList, часть 2

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

1. Вставка элемента в середину (или в начало) списка

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

Допустим есть список из 11 элементов:

Вставка элемента в середину (или в начало) списка

Мы хотим вставить число 10,000 в список под номером 5, для этого нужно всего лишь выполнить команду:

list.add(5, 10000);

Где list — это переменная типа ArrayList, метод add(int index, тип value) добавляет значение 10000 в позицию 5 в списке. Вот что при этом произойдет в методе add() :

Шаг 1: все элементы массива начиная с 5-го будут сдвинуты (скопированы) на 1 элемент к концу массива:

Вставка элемента в середину (или в начало) списка 1

Обратите внимание: элементы в 5-й и 6-й ячейке массива теперь одинаковые.

Шаг 2: записываем в 5-ю ячейку значение 10,000:

Вставка элемента в середину (или в начало) списка 2

Теперь в списке есть все элементы массива, а в пятой ячейке записано число 10,000. Как мы и хотели.



2. Удаление элемента из списка

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

Давайте удалим из списка элемент с индексом 3, для этого нужно выполнить команду:

list.remove(3);

Вот что при этом произойдет в методе remove():

Шаг 1: элементы массива начиная с 4-го будут сдвинуты (скопированы) на одну позицию ближе к началу массива:

Удаление элемента из списка 1

Шаг 2: значение переменной size будет уменьшено на 1.

Удаление элемента из списка 2

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

Шаг 3: стирание мусора

Удаление элемента из списка 3



3. Практические примеры работы со списком в Java

Давайте напишем несколько примеров работы со списками:

Занесём в список все четные числа от 1 до 20:

Код Примечания
ArrayList<Integer> list = new ArrayList<Integer>();

for (int i = 1; i <= 20; i++)
   if (i%2 == 0)
      list.add(i);
Создаем объект-список

цикл по всем числам 1 .. 20
если число делится на 2 без остатка,
добавить его в список

А теперь выведем все элементы списка на экран:

Код Примечания
ArrayList<Integer> list = new ArrayList<Integer>();

for (int i = 1; i <= 20; i++)
   if (i%2 == 0)
      list.add(i);

for (int i = 0; i < list.size(); i++)
   System.out.println(list.get(i));
Создаем объект-список
цикл по всем числам 1 .. 20

если число делится на 2 без остатка
добавить его в список

цикл от нуля до размера списка
выводим каждый элемент на экран

Удаление элементов:

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

Код Примечания
ArrayList<Integer> list = new ArrayList<Integer>();

for (int i = 1; i <= 20; i++)
   if (i%2 == 0)
      list.add(i);

for (int i = 0; i < list.size(); i++)
   if (list.get(i)%4 == 0)
   {
      list.remove(i);
      i--;
   }
Создаем объект-список

цикл по всем числам 1 .. 20
если число делится на 2 без остатка,
добавить его в список.

цикл от нуля до размера списка
если элемент списка делится на 4 без остатка:

а) удаляем элемент
б) уменьшаем счетчик i, чтобы на следующем витке цикла опять попасть на тот же элемент

Допустим, вам нужно удалить 3 последних элемента списка.

Как это сделать неправильно:

Код Примечания
ArrayList<Integer> list = new ArrayList<Integer>();

for (int i = 1; i <= 20; i++)
   if (i%2 == 0)
      list.add(i);

int n = list.size();
list.remove(n - 3);
list.remove(n - 2);
list.remove(n - 1);
Создаем объект-список

в списке 10 элементов: 2, 4, 6, ... 20



n = 10
n - 3 = 7 (в списке осталось 9 элементов)
n - 2 = 8 (в списке осталось 8 элементов)
n - 1 = 9 (в списке осталось 7 элементов)

После удаления 7 и 8 элементов, в списке останется всего 8 элементов. Поэтому 9-й элемент удалить не получится — в программе возникнет ошибка.

Как нужно было удалить элементы:

Вариант 1 Вариант 2
int n = list.size();
list.remove(n - 3);
list.remove(n - 3);
list.remove(n - 3);
int n = list.size();
list.remove(n - 1);
list.remove(n - 2);
list.remove(n - 3);

Элементы нужно или удалять с конца, или просто в одном и том же месте, а после каждого удаления элементы будут сдвигаться на один.


Комментарии (353)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Grigoryvvv Уровень 14 Expert
15 января 2026
15.01.2026 / 13 уровень
Константин Уровень 8
31 октября 2025
while(!glasses.isEmpty()) { glasses.remove(glasses.size() - 1); }
Александр Уровень 19
16 января 2026
А чё тада уж не glasses.removeLast(); ?)
Андрей Иванов Уровень 20
28 сентября 2025
в п.2 "удаление" в слайдах мне кажется ошибка. Значения 25 не должно быть.
Eugene Maslennikov Уровень 23
1 октября 2025
так там значение 20 удалили а не 25, посмотри внимательнее ✌
Георгий Уровень 26
25 ноября 2025
Предыдущий слайд смотри, там исходный массив, на пункте 2 слайд уже с изменениями массива (первый шаг remove).
Anonymous #3235765 Уровень 15
25 ноября 2025
Точно. По невниманию
Alexey Ulov Уровень 16
5 августа 2025
Наконец-то нормальные лекции и интересные задачи.
Руслан Уровень 48
29 июля 2025
ArrayList<Integer> list = new ArrayList<Integer>(); for (int i = 1; i <= 20; i++) if (i%2 == 0) list.add(i); int n = list.size(); list.remove(n - 3); list.remove(n - 2); list.remove(n - 1); Ребят если кто не понял переменная n как получила размер так и она не будет его менять поэтому в конце мы пытаемся удалить 9 элемент из списка в котором всего 8 элементов !! Лучше писать так list.remove(list.size - 1) так всегда будет с конца удаление
10 сентября 2025
Говорят грех вызывать каждый раз получение длины. В рабочих задачах лучше так не делать)
Anonymous #3585174 Уровень 33
29 июня 2025
like
Danya Уровень 17
13 апреля 2025
2 задачу сам не смог решить анлак(
Java-Самурай Уровень 13
3 июля 2025
Какие у тебя были затруднения?
Уровень 35
19 июля 2025
если что то мне и помогает так это перечитывание условия задачи:]
Александр Уровень 26
3 апреля 2025
В задаче про паскаль можно воспользоваться методом indexOf и таким образом решение в одну строку

programmingLanguages.remove(programmingLanguages.indexOf("Pascal"));
Жуков Богдан Уровень 26
14 апреля 2025
А можно и так:

programmingLanguages.remove("Pascal");
Java-Самурай Уровень 13
3 июля 2025
Или так: programmingLanguages.remove(6);
Big198801 Уровень 29
25 августа 2025
однако не сработает, если в списке окажется более одного паскаля) НО, в ТЗ про не сказано, что могут быть одинаковые строки, значит прокатит)
30 января 2025
while (glasses.size() > 0) { glasses.remove(glasses.size() - 1); }
Victor Уровень 39
23 января 2025
Круто - я создал Звезду смерти с первой попытки