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

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