Интерфейс List и класс ArrayList
Интерфейс List сохраняет последовательность добавления элементов и позволяет осуществлять доступ к элементу по индексу. Он расширяет интерфейс Collection и таким образом наследует все его методы, и вместе с тем добавляет свои методы:
- void add(int index, Е obj) — вставляет obj в вызывающий список в позицию, указанную в index . Любые ранее вставленные элементы за указанной позицией вставки смещаются вверх. То есть никакие элементы не перезаписываются.
- bооlеаn addAll (int index, Collection с) — в ставляет все элементы в вызывающий список, начиная с позиции, переданной в index . Все ранее существовавшие элементы за точкой вставки смещаются вверх. То есть никакие элементы не перезаписываются. Возвращает true , если вызывающий список изменяется, и false в противном случае.
- Е get (int index) — возвращает объект, сохраненный в указанной позиции вызывающего списка.
- int indexOf(Object obj) — возвращает индекс первого экземпляра obj в вызывающем списке. Если obj не содержится в списке, возвращается 1.
- int lastlndexOf(Object obj) — возвращает индекс последнего экземпляра obj в вызывающем списке. Если obj не содержится в списке, возвращается 1.
- Listlterator listlterator() — возвращает итератор, указывающий на начало списка.
- Listlterator listlterator(int index) — возвращает итератор, указывающий на заданную позицию в списке.
- Е remove(int index) — удаляет элемент из вызывающего списка в позиции index и возвращает удаленный элемент. Результирующий список уплотняется, то есть элементы, следующие за удаленным, сдвигаются на одну позицию назад.
- Е set (int index, Е obj) — присваивает obj элементу, находящемуся в списке в позиции index.
- default void sort(Comparator c) — сортирует список, используя заданный компаратор (добавлен в версии JDK 8).
- List subList (int start, int end) — возвращает список, включающий элементы от start до end-1 из вызывающего списка. Элементы из возвращаемого списка также сохраняют ссылки в вызывающем списке.
Если посмотреть на методы интерфейса List более внимательно, можно заметить, что почти все их них манипулируют индексом элемента.
Структура иерархии интерфейса List :

2. Особенности класса ArrayList
Одной из реализаций интерфейса List является класс ArrayList . Он поддерживает динамические массивы, которые могут расти по мере необходимости. Элементы ArrayList могут быть абсолютно любых типов, в том числе и null. Элементы в этом виде коллекции могут повторяться.
Данный класс используется чаще всех остальных реализаций коллекции.
Внутреннее устройство класса
Давайте начнем изучение этого класса с рассмотрения его внутреннего устройства, что важно для понимания при выборе класса коллекции.
Объект класса ArrayList , содержит свойства elementData и size . Хранилище значений elementData есть не что иное, как массив определенного типа (указанного в generic). По умолчанию размер этого внутреннего массива будет иметь размер 16 (при создании класса конструктором без параметров). Если пользователь добавит в ArrayList больше 16 элементов, ничего плохого не произойдет (в отличие от массивов, где будет выброшено ArrayIndexOutOfBoundsException исключение). В этом случае просто произойдет пересоздание внутреннего массива elementData , и это произойдет неявно для пользователя.
В случае если вы заранее знаете максимальное количество элементов в создаваемой коллекции, размер массива можно указать передав нужное значение в конструктор ArrayList . Такая программа не будет тратить ресурсы на пересоздание внутреннего массива и конечно же будет работать немного быстрее.
Конструкторы класса
У этого класса есть следующие конструкторы:
- ArrayList() — помогает создать пустую коллекцию с внутренним массивом размер которого будет 16.
- ArrayList(Collection сollection) — создает коллекцию и заполняет ее элементами из передаваемой коллекции collection.
- ArrayList(int capacity) — помогает создать пустую коллекцию с внутренним массивом, размер которого будет равен значению параметра capacity .
Из внутреннего устройства класса следуют его достоинства и недостатки. Рассмотрим их.
Достоинства класса ArrayList
- Быстрый доступ по индексу. Скорость такой операции — O(1).
- Быстрая вставка и удаление элементов с конца. Скорость операций опять же — O(1).
Недостатки класса ArrayList
- Медленная вставка и удаление элементов из середины. Такие операции имеют сложность O(n). Поэтому, если вы понимаете, что вам придется выполнять достаточно много операций такого типа, может быть лучше выбрать другой класс.
3. Добавления элементов в класс ArrayList
Для удобства в следующем списке приведены все методы, позволяющие добавлять элементы в объект класса ArrayList :
- boolean add(E obj) — добавляет obj к вызывающей коллекции. Возвращает true, если obj был добавлен к коллекции. (Интерфейс Collection )
- void add(int index, Е obj) — вставляет obj в вызывающий список в позицию, указанную в index . Любые ранее вставленные элементы за указанной позицией вставки смещаются вверх. То есть никакие элементы не перезаписываются. (Интерфейс List )
- Е set (int index, Е obj) — присваивает obj элементу, находящемуся в списке в позиции index . (Интерфейс List )
- boolean addAll (Collection с) — добавляет все элементы к вызывающей коллекции. Возвращает true , если операция удалась (то есть все элементы добавлены). В противном случае возвращает false . (Интерфейс Collection )
В следующем примере рассмотрим создание объекта класса ArrayList и добавление в него элементов с помощью указанных выше методов:
import java.util.ArrayList; import java.util.List; public class ArrayListAddDemo < public static void main(String[] args) < ListarrayList = new ArrayList<>(); System.out.println("Начальный размер arrayList: " + arrayList.size()); arrayList.add("C"); arrayList.add("A"); arrayList.add("E"); arrayList.add("B"); arrayList.add("D"); arrayList.add("F"); arrayList.add("F"); arrayList.add(1, "A2"); arrayList.set(0, "C2"); System.out.println("Размер arrayList после добавления: " + arrayList.size()); System.out.println("Содержимое arrayList: " + arrayList); System.out.println(arrayList.get(0)); > >
4. Методы класса ArrayList для удаления элементов
Для удобства в следующем списке приведены все методы, позволяющие удалять элементы из объекта класса ArrayList :
- boolean remove(Object obj) — удаляет один экземпляр obj из вызывающей коллекции. Возвращает true , если элемент удален. В противном случае возвращает false . (Интерфейс Collection )
- Е remove(int index) — удаляет элемент из вызывающего списка в позиции index и возвращает удаленный элемент. Результирующий список уплотняется, то есть элементы, следующие за удаленным, сдвигаются на одну позицию назад. (Интерфейс List )
- boolean removeAll(Collection с) — удаляет все элементы из вызывающей коллекции. Возвращает truе , если в результате коллекция изменяется (то есть элементы удалены). В противном случае возвращает false . (Интерфейс Collection )
- boolean retainAll(Collection с) — удаляет все элементы кроме входящих из вызывающей коллекции. Возвращает true , если в результате коллекция изменяется (то есть элементы удалены). В противном случае возвращает false . (Интерфейс Collection )
- void clear() — удаляет все элементы вызывающей коллекции. (Интерфейс Collection )
5. Пример удаления элементов из ArrayList
public class ArrayListRemoveDemo < public static void main(String[] args) < ListarrayList = new ArrayList<>(); arrayList.add("C"); arrayList.add("A"); arrayList.add("E"); arrayList.add("B"); arrayList.add("D"); arrayList.add("F"); arrayList.add("F"); arrayList.add(1, "A2"); arrayList.set(0, "C2"); System.out.println("Содержимое arrayList: " + arrayList); System.out.println("Размер arrayList после добавления: " + arrayList.size()); arrayList.remove("F"); arrayList.remove(2); System.out.println("Размер arrayList после удаления: " + arrayList.size()); System.out.println("Содержимое of arrayList: " + arrayList); > >
6. Пример использования метода removeAll() класса ArrayList
import java.util.ArrayList; import java.util.List; public class ArrayListRemoveAllDemo < public static void main(String[] args) < ListarrayList = new ArrayList<>(); arrayList.add("C"); arrayList.add("A"); arrayList.add("E"); arrayList.add("B"); arrayList.add("D"); arrayList.add("F"); arrayList.add("F"); arrayList.add(1, "A2"); arrayList.set(0, "C2"); List removeElements = List.of("C2", "A2", "AA", "F"); System.out.println("Содержимое arrayList до removeAll: " + arrayList); arrayList.removeAll(removeElements); System.out.println("Содержимое arrayList после removeAll: " + arrayList); > >
7. Пример использования методов addAll(), clear() класса ArrayList
public class ArrayListDemo2 < public static void main(String[] args) < ListarrayList1 = new ArrayList<>(); List arrayList2 = List.of("1", "2"); arrayList1.add("A"); arrayList1.add("B"); arrayList1.add("C"); arrayList1.add("D"); arrayList1.add("E"); arrayList1.add("F"); System.out.println("arrayList1 до добавления " + arrayList1); arrayList1.addAll(3, arrayList2); System.out.println("arrayList1 после добавления " + arrayList1); arrayList1.clear(); System.out.println("arrayList1 после очистки " + arrayList1); > >
8. Пример использования метода retainAll() класса ArrayList
import java.util.ArrayList; import java.util.List; public class ArrayListRetainAllDemo < public static void main(String[] args) < ListarrayList1 = new ArrayList<>(); List arrayList2 = List.of("F", "FF", "E"); arrayList1.add("A"); arrayList1.add("A"); arrayList1.add("B"); arrayList1.add("C"); arrayList1.add("D"); arrayList1.add("E"); arrayList1.add("F"); arrayList1.add("F"); arrayList1.retainAll(arrayList2); System.out.println(arrayList1); > >
9. Получение массива из ArrayList
Достаточно частая задача — это получение массива из коллекции. Для этого в интерфейсе Collection объявлен метод toArray() . Имеются два варианта метода toArray() :
-
Object [] toArray() — создает массив типа Object и записывает в него значения из вызывающей коллекции:
import java.util.Arrays; import java.util.List; public class ArrayListToStringDemo < public static void main(String[] args) < ListarrayList = List.of("C", "A", "E", "B", "D", "F"); Object[] objectArray = arrayList.toArray(); System.out.println(Arrays.toString(objectArray)); > >
import java.util.Arrays; import java.util.List; public class ArrayListToStringDemo < public static void main(String[] args) < ListarrayList = List.of("C", "A", "E", "B", "D", "F"); //1 вариант String[] stringArray1 = new String[arrayList.size()]; arrayList.toArray(stringArray1); System.out.println(Arrays.toString(stringArray1)); //2 вариант String[] stringArray2 = arrayList.toArray(new String[0]); System.out.println(Arrays.toString(stringArray2)); > >
- Интерфейс Collection
- Структуры данных
- Интерфейс Set и классы HashSet, LinkedHashSet
- Интерфейс SortedSet и класс TreeSet
- Интерфейсы Comparable и Comparator
- Интерфейс NavigableSet
- Интерфейсы Queue и Deque
- Класс ArrayDeque
- Класс LinkedList
- Класс PriorityQueue
- Интерфейс Iterator
- Интерфейс ListIterator
- Отображения Map
- Класс Collections
- Backed Collections
- Legacy Classes
- Задания
Отличия Arrays.asList() и List.of() в Java

Иногда в Java нам нужно создать небольшой список или преобразовать массив в список для удобства. Java предоставляет для этого несколько вспомогательных методов.
В этой статье мы сравним два основных способа инициализации коллекций: List.of() и Array.asList().
Использование Arrays.asList()
Метод Arrays.asList(), который является частью Java Collections Framework, введенный в Java 1.2, упрощает создание списков. Он может принимать массив в качестве входных данных и создавать фиксированный List объектов из предоставленного массива:
Integer[] array = new Integer[]; List list = Arrays.asList(array);
Как видно, создать простой список целых чисел очень легко.
Неподдерживаемые операции в возвращаемом списке
Метод asList() возвращает список фиксированного размера. Следовательно, добавление и удаление новых элементов вызывает исключение UnsupportedOperationException:
List list = Arrays.asList(1, 2, 3, 4, 5, 6); list.add(7); list.remove(1); // Exception in thread "main" java.lang.UnsupportedOperationException
Важно отметить, что список не создает копию входного массива. Вместо этого он оборачивает исходный массив с помощью интерфейса List. Следовательно, изменения в массиве отражаются и на списке:
Мы должны отметить, что список не создает копию входного массива. Вместо этого он оборачивает исходный массив с помощью интерфейса списка. Следовательно, изменения в массиве отражаются и на списке:
Integer[] array = new Integer[]; List list = Arrays.asList(array); array[0] = 10; // здесь list.get(0) == 10
Кроме того, список, возвращаемый Arrays.asList(), является изменяемым. То есть мы можем изменять отдельные элементы списка:
List list = Arrays.asList(1, 2, 3); list.set(1, 4); // здесь list.get(1) == 4
В конечном счете, это может привести к нежелательным побочным эффектам, вызывающим ошибки, которые трудно обнаружить. Когда массив передается в качестве входных данных, изменение в списке также будет отражено и в массиве:
Integer[] array = new Integer[]; List list = Arrays.asList(array); list.set(0, 5); // здесь array[0] == 5
Давайте теперь посмотрим на другой способ создания списков.
Использование List.of()
В отличие от Arrays.asList(), Java 9 представила более удобный метод List.of(). Этот метод создает экземпляры неизменяемых списков:
String[] array = new String[]; List list = List.of(array);
Отличия от Arrays.asList()
Основное отличие заключается в том, что List.of() возвращает неизменяемый список, который является копией входного массива. По этой причине изменения в исходном массиве не отражаются в возвращаемом списке:
String[] array = new String[]; List list = List.of(array); array[0] = "С++"; // здесь list.get(0) == "Java"
Кроме того, мы не можем изменять элементы списка. Если мы попытаемся это сделать, возникнет исключение UnsupportedOperationException:
String[] array = new String[]; List list = List.of(array); list.set(1, "C++"); // Exception in thread "main" java.lang.UnsupportedOperationException
Также нужно отметить, что List.of() не допускает значений null в качестве входных данных и вызовет исключение NullPointerException:
List.of("Hello", null, "World") // Exception in thread "main" java.lang.NullPointerException
Заключение
В этой короткой статье мы рассмотрели создание списков в Java с использованием List.of() и Arrays.asList() и отличия в этих методах.
Списки — Java: Коллекции
List в java – это интерфейс, который предоставляет возможность поддерживать упорядоченную коллекцию. Он содержит основанные на индексах методы для вставки, обновления, удаления и поиска элементов. Он также может иметь повторяющиеся элементы.
ArrayList
Класс ArrayList – реализация интерфейса List . Представляет собой автоматически расширяемый массив. ArrayList может менять свой размер во время исполнения программы
// Создаем новый экземпляр ArrayList ListString> list = new ArrayList<>(); System.out.println(list); // => [] // Добавляем элементы в список list.add("1"); list.add(null); list.add(null); list.add("2"); list.add("3"); list.add("3"); System.out.println(list); //=> [1, null, null, 2, 3, 3] list.remove(0); System.out.println(list); // => [null, null, 2, 3, 3] list.remove("3"); list.remove("4"); System.out.println(list); // => [null, null, 2, 3] System.out.println(list.size()); // => 4 ListString> insertedList = new ArrayList<>(); insertedList.add("1"); insertedList.add("2"); insertedList.add("7"); insertedList.add("7"); System.out.println(insertedList); // => [1, 2, 7, 7] list.addAll(2, insertedList); System.out.println(list); // => [null, null, 1, 2, 7, 7, 2, 3] System.out.println(list.indexOf("7")); // => 4 System.out.println(list.get(3)); // => 2 System.out.println(list.isEmpty()); // => false System.out.println(list.contains("2")); // => true System.out.println(list.contains("11")); // => false for (String s : list) System.out.println("element of list: " + s); >
// Создаем новую переменную с типом ArrayList ArrayListString> arrayList = (ArrayListString>) list; System.out.println(arrayList); // => [null, null, 1, 2, 7, 7, 2, 3]
LinkedList
Класс LinkedList — еще одна реализация интерфейса List . Представляет из себя двусвязный список, где каждый элемент структуры содержит ссылки на предыдущий и следующий элементы. По этим ссылкам можно переходить от одного элемента к другому.
// Создаем новый экземпляр двусвязного списка ListInteger> list = new LinkedList<>(); // Добавляем/удаляем элементы list.add(1); list.add(2); list.add(null); list.add(3); list.add(4); list.remove(1); list.add(null); System.out.println(list); // => [1, null, 3, 4, null] System.out.println(list.size()); // => 5 System.out.println(list.get(0)); // => 1 System.out.println(list.indexOf(3)); // => 2 LinkedListInteger> linkedList = (LinkedListInteger>) list; // Получаем, но не удаляем первый элемент списка System.out.println(linkedList.peek()); // => 1 System.out.println(list); // => [1, null, 3, 4, null] // Получаем и удаляем первый элемент списка System.out.println(linkedList.poll()); // => 1 System.out.println(linkedList); // => [null, 3, 4, null] // Вставляем элемент в начало списка linkedList.addFirst(3); System.out.println(linkedList); // => [3, null, 3, 4, null] for (Integer num: linkedList) System.out.println("int: " + num); >
List в Java

Привет! В нашем самоучителе мы рассмотрим следующие коллекции:
- Список (List) — также рекомендуем прочитать статью «Что такое ArrayList»
- Множество (Set) — см. статью «Set в Java»
- Очередь (Queue) — см. статью «Queue в Java»
Это статья про структуру данных список (List) — один из способов хранения данных в Java.
Что такое список (list) в Java
До этого Вы, скорее всего, были знакомы только с одним способом хранения данных — массивом. Давайте рассмотрим и другие способы. Один из таких «способов» — это хранение данных в списке.
Виды списков
Списков существует несколько. List — это только название интерфейса, который объединяет несколько реализаций:

На практике мы чаще всего используем:
- ArrayList ( мы также рассматривали в статье «Что такое ArrayList»)
- LinkedList
На Vector можете не смотреть
Как хранятся данные
Так что же все-таки такое List? В памяти его можно представить так:

То есть список, в классическом смысле — это тип данных, в котором каждый элемент содержит какой-то контент (например, String, Integer или вообще какой-нибудь объект), а также ссылку на следующий элемент списка.
Зачем?
Основное преимущество списка по сравнению с массивом — его можно легко расширять.
Если у нас есть массив на 3 элемента, а нам вдруг понадобилось положить туда 10 элементов, нам просто придется создавать новый массив на 10 элементов. Только так и никак иначе! ;(
Но со списками все по-другому. Мы можем свободно добавлять элементы в начало, середину или конец списка. Все потому, что для массива нам нужен один «сплошной» участок памяти, и чтобы его расширить, придется искать другой «целый» кусок памяти. Но с List проще — мы просто меняем ссылки:
Итак, перейдем от теории к практике.
Отличие ArrayList и LinkedList
Не вдаваясь в подробности, запомните, что:
- LinkedList лучше использовать, если Вы знаете, что будете часто добавлять и удалять элементы из списка.
- ArrayList лучше использовать, если Вам главное иметь быстрый доступ к элементам списка.
Синтаксис