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

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

Открыта

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);

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


Комментарии (354)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Семен
Уровень 14
27 января, 09:11
так быстро пирамидку разобрал... glasses.clear(); но нет )
Grigoryvvv
Уровень 14
Expert
15 января, 17:17
15.01.2026 / 13 уровень
Константин
Уровень 11
31 октября 2025, 10:43
while(!glasses.isEmpty()) { glasses.remove(glasses.size() - 1); }
Александр
Уровень 31
16 января, 13:18
А чё тада уж не glasses.removeLast(); ?)
28 сентября 2025, 08:33
в п.2 "удаление" в слайдах мне кажется ошибка. Значения 25 не должно быть.
Eugene Maslennikovкот в приюте
1 октября 2025, 16:41
так там значение 20 удалили а не 25, посмотри внимательнее ✌
Георгий
Уровень 38
25 ноября 2025, 12:16
Предыдущий слайд смотри, там исходный массив, на пункте 2 слайд уже с изменениями массива (первый шаг remove).
Anonymous #3235765
Уровень 15
25 ноября 2025, 13:41
Точно. По невниманию
Alexey Ulov
Уровень 16
5 августа 2025, 09:59
Наконец-то нормальные лекции и интересные задачи.
Руслан
Уровень 48
29 июля 2025, 13:05
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, 13:23
Говорят грех вызывать каждый раз получение длины. В рабочих задачах лучше так не делать)
Anonymous #3585174
Уровень 33
29 июня 2025, 14:48
like
Danya Java Developer
13 апреля 2025, 19:13
2 задачу сам не смог решить анлак(
Java-СамурайРаботает в https://t.me/JavaSam
3 июля 2025, 16:54
Какие у тебя были затруднения?
Уровень 35
19 июля 2025, 10:22
если что то мне и помогает так это перечитывание условия задачи:]
Александр
Уровень 26
3 апреля 2025, 17:56
В задаче про паскаль можно воспользоваться методом indexOf и таким образом решение в одну строку
programmingLanguages.remove(programmingLanguages.indexOf("Pascal"));
Жуков Богдан Системный аналитик
14 апреля 2025, 16:06
А можно и так:
programmingLanguages.remove("Pascal");
Java-СамурайРаботает в https://t.me/JavaSam
3 июля 2025, 16:55
Или так: programmingLanguages.remove(6);
Big198801
Уровень 32
25 августа 2025, 19:30
однако не сработает, если в списке окажется более одного паскаля) НО, в ТЗ про не сказано, что могут быть одинаковые строки, значит прокатит)
30 января 2025, 14:48
while (glasses.size() > 0) { glasses.remove(glasses.size() - 1); }