Методы List в Java: add() и addAll()

В этом мануале мы поговорим о том, как в Java работают методы add() и addAll(). 

Метод List add()

Этот метод используется для добавления элементов в список. Существует два способа сделать это:

  1. add(E e): добавляет элемент в конец списка. Поскольку List поддерживает Generics, тип добавляемых элементов определяется при создании списка.
  2. add(int index, E element): вставляет элемент в список по заданному индексу. Элементы из заданного индекса сдвигаются по списку вправо. Если заданный индекс выходит за пределы допустимого диапазона, метод выдает IndexOutOfBoundsException.

Давайте рассмотрим несколько примеров применения List add():

package com.journaldev.examples;

import java.util.ArrayList;
import java.util.List;

public class ListAddExamples {

public static void main(String[] args) {

List<String> vowels = new ArrayList<>();

vowels.add("A"); // [A]
vowels.add("E"); // [A, E]
vowels.add("U"); // [A, E, U]

System.out.println(vowels); // [A, E, U]

vowels.add(2, "I"); // [A, E, I, U]
vowels.add(3, "O"); // [A, E, I, O, U]

System.out.println(vowels); // [A, E, I, O, U]
}
}

Во-первых, этот код добавит A, E и U в список и выведет [A, E, U].

Затем этот код добавит I по индексу 2, что в результате выдаст [A, E, I, U]. Затем он добавит O по индексу 3, чтобы получилось [A, E, I, O, U]. В конце он выведет этот список на экран.

Метод List addAll()

Этот метод используется для добавления элементов из коллекции в список. Существует два перегруженных метода addAll():

  1. addAll(Collection<? extends E> c): этот метод добавляет все элементы из заданной коллекции в конец списка. Порядок вставки зависит от порядка, в котором их возвращает итератор коллекции.
  2. addAll(int index, Collection<? extends E> c): этот метод можно использовать для вставки элементов из коллекции по заданному индексу. Все элементы в списке смещаются вправо, чтобы освободить место для элементов из коллекции.

Читайте также: Переопределение и перегрузка в java

Вот несколько примеров применения метода List addAll():

package com.journaldev.examples;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ListAddAllExamples {

public static void main(String[] args) {

List<Integer> primeNumbers = new ArrayList<>();

primeNumbers.addAll(Arrays.asList(2, 7, 11));

System.out.println(primeNumbers); // [2, 7, 11]

primeNumbers.addAll(1, Arrays.asList(3, 5));

System.out.println(primeNumbers); // [2, 3, 5, 7, 11]
}
}

Сначала этот код создает новый список со значениями [2, 7, 11]. Затем этот список выводится на экран.

Далее создается второй список со значением [3, 5]. После этого этот второй список добавляется к первому с помощью addAll() по индексу 1. В результате на экран выводится список [2, 3, 5, 7, 11].

Исключение UnsupportedOperationException и метод add()

В документации по методам List add() и addAll() указано, что реализация списка может не поддерживать опциональные операции. В этом случае методы list add() вызывают исключение UnsupportedOperationException. Чаще всего вы можете встретить это исключение в двух распространенных сценариях:

  1. Arrays.asList(): этот метод возвращает список фиксированного размера, поскольку он поддерживается указанным массивом. Любая операция, которая меняет размер списка, вызывает исключение UnsupportedOperationException.
  2. Collections.unmodifiedList(List l): этот метод возвращает неизменяемый вид данного списка. Соответственно, операции add() вызывают исключение UnsupportedOperationException.

Давайте взглянем на пример UnsupportedOperationException с операцией добавления элемента в список фиксированного размера:

jshell> List<Integer> ints = Arrays.asList(1,2,3);
ints ==> [1, 2, 3]

jshell> ints.add(4);
|  Exception java.lang.UnsupportedOperationException
|        at AbstractList.add (AbstractList.java:153)
|        at AbstractList.add (AbstractList.java:111)
|        at (#4:1)

Сначала этот код создает список фиксированного размера – [1, 2, 3]. Затем он пытается добавить в список элемент 4. Это приводит к возникновению исключения UnsupportedOperationException.

Теперь посмотрите на другой пример UnsupportedOperationException с операцией добавления в неизменяемое представление данного списка:

jshell> List<String> strs = new ArrayList<>();
strs ==> []

jshell> strs.add("A");
$6 ==> true

jshell> List<String> strs1 = Collections.unmodifiableList(strs);
strs1 ==> [A]

jshell> strs1.add("B");
|  Exception java.lang.UnsupportedOperationException
|        at Collections$UnmodifiableCollection.add (Collections.java:1058)
|        at (#8:1)

Данный код добавляет элемент A в список. Затем он пытается добавить в неизменяемое представление предыдущего списка новый элемент B. Это приводит к возникновению исключения UnsupportedOperationException.

Заключение

В этой статье вы узнали о том, как работают методы Java List add() и addAll().

Читайте также:

Tags:

Добавить комментарий