Интерфейс 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 и классы
- Интерфейс Iterator
- Интерфейс ListIterator
- Отображения Map
- Класс Collections
- Backed Collections
- Legacy Classes
- Задания
ArrayList
ArrayList – это класс, позволяющий создавать списки, входит в состав библиотеки java.util. В Java объекты типа ArrayList иногда называют списочными массивами.
Списки, наряду с множествами и словарями, относятся к коллекциям.
Кроме ArrayList существует другие типы списков – LinkedList, Vector, Stack. List является интерфейсом всех четырех классов. Отличие между разными списками заключается во внутреннем способе работы с памятью. Так LinkedList будет быстрее, если приходится часто вставлять в середину или удалять элементы. ArrayList быстрее для операций взятия и изменения значений элементов. Заметим, тип переменной может быть интерфейсом, а вот объект – всегда создаваться от конкретного класса. Например: List a = new ArrayList <> ( ) .
Примечание. В Java есть понятия сужения и расширения типов. Так переменной типа Object может быть присвоен любой объект: Object var = «Hello» . Сужение типа: String str = ( String ) var .
В отличие от обычных массивов, списки являются автоматически расширяемыми. Это значит, что можно менять количество составляющих их элементов, добавлять и удалять элементы из любого места структуры.
В Java элементы списка могут быть разного типа или же только одного. Во втором случае, который используется чаще, тип указывается в угловых скобках:
ArrayList a1 = new ArrayList(); a1.add(1); a1.add("Box"); System.out.println(a1.get(0)); System.out.println(a1.get(1)); ArrayListString> a2 = new ArrayList<>(); a2.add("cd"); a2.add(0, "ab"); System.out.println(a2.toString());
ArrayList относится к так называемым дженерикам (generics), т. е. обобщениям. От таких классов создаются объекты-контейнеры, для которых можно указывать тип входящих в контейнер объектов. При этом входящие в состав контейнера объекты должны быть именно объектами, а не примитивными типами данных. Так вместо int следует использовать Integer.
Класс ArrayList содержит множество методов для работы со списками. Ключевыми являются add(), get(), set(), remove(), size().
Метод add() по умолчанию добавляет элемент в конец списка. Однако первым аргументом можно передать позицию вставки. Метод set() не добавляет элемент, а заменяет существующий в указанной позиции. Поэтому всегда требует указания индекса заменяемого элемента.
import java.util.ArrayList; public class ArrayListMethods public static void main(String[] args) ArrayListTest> tests = new ArrayList<>(); tests.add(new Test(10)); Test t = new Test(20); tests.add(t); tests.add(new Test(99)); for (Test test : tests) System.out.print(test.n + " "); > System.out.println(); tests.set(2, new Test(90)); tests.remove(0); for (Test test : tests) System.out.print(test.n + " "); > System.out.println(); > > class Test int n; Test(int num) this.n = num; > >
10 20 99 20 90
X Скрыть Наверх
Программирование на Java. Курс
Различия между Set и List в Java
При работе с коллекциями в Java часто возникает необходимость выбора между использованием Set или List . Оба варианта являются интерфейсами коллекций, и оба могут содержать набор объектов. Однако, несмотря на внешнюю схожесть, они имеют важные различия.
Рассмотрим пример. Представим, что у нас есть коллекция фруктов. С одной стороны, можно хранить каждый фрукт в списке, где каждый фрукт будет занимать конкретное место и можно будет легко обращаться к конкретному фрукту по его индексу. С другой стороны, можно хранить фрукты в множестве, где каждый фрукт будет уникален, и не важно, в каком порядке они хранятся.
Первый вариант представляет собой List , а второй — Set . Рассмотрим каждую из этих коллекций подробнее.
List
List — это упорядоченная коллекция (или последовательность). В List элементы добавляются в конец списка. При этом в List допускается наличие дубликатов, то есть одного и того же элемента может быть несколько.
Списки поддерживают индексацию элементов, что позволяет быстро обращаться к элементам по их индексу.
Set
Set — это коллекция, которая не содержит дубликатов. Каждый элемент в Set уникален.
Порядок элементов в Set не гарантируется. Это значит, что элементы могут быть расположены в любом порядке и этот порядок может меняться при добавлении или удалении элементов.
Заключение
Таким образом, выбор между Set и List будет зависеть от конкретных требований к задаче. Если важен порядок элементов и допускается наличие дубликатов, то лучше выбрать List . Если важна уникальность элементов и порядок не важен, то подойдет Set .
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 лучше использовать, если Вам главное иметь быстрый доступ к элементам списка.
Синтаксис