SlideShare a Scribd company logo
Списки (List)
Виталий Унгурян
unguryan@itstep.org
Списки - List
Интерфейс java.util.List<E> служит для
описания списков.
Данный интерфейс определяет
поведение коллекций, которые служат
для хранения упорядоченного набора
объектов. Порядок в котором хранятся
элементы определяется порядком их
добавления в список.
List
Коллекции, реализующие интерфейс
java.util.List<E> могут хранить 1, 2 и
более копий одного и того же объекта
(ссылки на объект). Может хранить null.
Иерархия списков
ArrayList
ArrayList - самая часто используемая
коллекция. ArrayList инкапсулирует в
себе обычный массив, длина которого
автоматически увеличивается при
добавлении новых элементов.
Так как ArrayList использует массив, то
время доступа к элементу по индексу
минимально.
Пример ArrayList
List list = new ArrayList();
list.add(“Васька”);
list.add(3);
Object object = list.get(0);
List<String> catNames = new ArrayList<>(5);
catNames.add(“Васька”);
String name = catNames.get(0);
new ArrayList
Только что созданный объект
списка (list), содержит свойства
elementData и size.
Хранилище значений elementData
— это массив определённого типа
(указанного в generic).
new ArrayList
Если вызывается конструктор без
параметров, то по умолчанию будет создан
массив из 10-ти элементов типа Object (с
приведением к типу, разумеется).
Вы можете использовать конструктор
ArrayList(capacity) и указать свою начальную
ёмкость списка.
Изменение ArrayList
При удалении произвольного элемента
из списка, все элементы находящиеся
«правее» смещаются на одну ячейку
влево, при этом реальный размер
массива (его ёмкость, capacity) не
изменяется.
Изменение ArrayList
Если при добавлении элемента,
оказывается, что массив полностью
заполнен, будет создан новый массив
размером (n * 3) / 2 + 1, в него будут
помещены все элементы из старого
массива + новый, добавляемый
элемент.
Метод add(E element)
Внутри метода add(value) происходят
следующие вещи:
1.Проверяется, достаточно ли места в
массиве для вставки нового элемента
ensureCapacity(size + 1);;
2.добавляется элемент в конец
(согласно значению size) массива.
ensureCapacity(minCapacity)
Если места в массиве не достаточно,
новая емкость рассчитывается по
формуле (oldCapacity * 3) / 2 + 1.
Копирование элементов
осуществляется с помощью native
метода System.arraycopy().
Выделение дополнительной памяти
При добавлении 11-го элемента, проверка показывает что места
в массиве нет. Соответственно создаётся новый массив и
вызывается System.arraycopy().
Добавление в середину списка
1. Проверяется, достаточно ли места в
массиве для вставки нового элемента;
2. Подготавливается место для нового
элемента с помощью System.arraycopy();
1. Пере записывается значение у элемента с
указанным индексом.
Удаление элементов
Удалять элементы можно двумя способами:
— по индексу remove(index)
Пример : list.remove(5);
— по значению remove(value)
Пример : list.remove(“Dog”);
При удалении элементов текущая величина capacity
не уменьшается, что может привести к
своеобразным утечкам памяти. Поэтому не стоит
пренебрегать методом trimToSize().
RandomAccess
Маркерный интерфейс для указания,
что реализации поддерживают
произвольный доступ.
Итоги по ArrayList
Быстрый доступ к элементам по индексу за
время O(1);
 Доступ к элементам по значению за
линейное время O(n);
 Медленный, когда вставляются и
удаляются элементы из «середины» списка;
 Позволяет хранить любые значения в том
числе и null;
 Не синхронизирован.
Односвязный список
LinkedList
LinkedList — это двусвязный список.
Это структура данных, состоящая из
узлов, каждый из которых содержит как
собственно данные, так и две ссылки
(«связки») на следующий и предыдущий
узел списка.
LinkedList
Доступ к произвольному элементу
осуществляется за линейное время (но
доступ к первому и последнему
элементу списка всегда
осуществляется за константное время
— ссылки постоянно хранятся на
первый и последний.
new LinkedList
Только что созданный объект
list, содержит свойства header
и size.
new LinkedList
Header — псевдо-элемент списка. Его
значение всегда равно null, а свойства
next и prev всегда указывают на
первый и последний элемент списка
соответственно. Так как на момент
создания список пуст, свойства next и
prev указывают сами на себя (т.е. на
элемент header). Размер списка size
равен 0.
Добавление элементов
Добавление элемента в конец списка с
помощью методом add(value),
addLast(value) и добавление в начало
списка с помощью addFirst(value)
выполняется за время O(1).
Внутри класса LinkedList существует
внутренний статический класс Entry, с
помощью которого создаются новые
элементы.
Добавление элемента
1. Создается новый новый экземпляр класса
Entry
1. Переопределяются указатели на
предыдущий и следующий элемент
Добавление следующего
Добавление элементов в
«середину» списка
Для того чтобы добавить элемент на
определённую позицию в списке,
необходимо вызвать метод add(index,
value). Отличие от add(value) состоит в
определении элемента перед которым
будет производиться вставка.
Добавление в середину
Удаление элементов
Удалять элементы из списка можно
несколькими способами:
— из начала или конца списка с
помощью removeFirst(), removeLast()
за время O(1);
— по индексу remove(index) и по
значению remove(value) за время O(n).
Удаление элемента
1. Поиск первого элемента с соответствующим значением
2. Переопределяются указатели на предыдущий и следующий
элемент
Итоги LinkedList
Из LinkedList можно организовать стэк,
очередь, или двойную очередь, со
временем доступа O(1);
 На вставку и удаление из середины списка,
получение элемента по индексу или
значению потребуется линейное время
O(n). Однако, на добавление и удаление из
середины списка, используя
ListIterator.add() и ListIterator.remove(),
потребуется O(1);
Итоги LinkedList
Позволяет добавлять любые
значения в том числе и null. Для
хранения примитивных типов
использует соответствующие классы-
оберки;
 Не синхронизирован.
LinkedList vs ArrayList
Добавлени элемента в конец списка:
ArrayList немного проигрывает, за счет
необходимости выделения памяти для новых
элементов.
Удаление элемента
из конца списка:
Тут ничья
LinkedList vs ArrayList
Добавление и удаление в начале
списка
С небольшим отрывом выигрывает
LinkedList
Добавление и удаление элементов в
середину списка
Выигрывает LinkedList, но с оговорками.
LinkedList vs ArrayList
Получение элемента из середине
списка
LinkedList в накауте, ArrayList пожинает
лавры.
Количество добавляемых элементов
ArrayList ограничен Integer.MAX_VALUE
В целом же, LinkedList в абсолютных величинах
проигрывает ArrayList и по потребляемой памяти и
по скорости выполнения операций.

More Related Content

What's hot (14)

PDF
Lec 3
Alexander Rusin
 
PPT
Java. Методы
Unguryan Vitaliy
 
PDF
Алгоритмы и структуры данных весна 2014 лекция 2
Technopark
 
PDF
Алгоритмы и структуры данных осень 2013 лекция 2
Technopark
 
PPT
Stream API
Unguryan Vitaliy
 
PPTX
Алгоритмы и структуры данных весна 2014 лекция 1
Technopark
 
PPTX
Collections
DmitryTrushkin
 
PPT
Алгоритмы сортировки
Нижегородский институт управления
 
PPTX
алгоритмы stl
mcroitor
 
PPT
Java. Массивы. Многомерные массивы.
Unguryan Vitaliy
 
PDF
Рекурсия. Поиск
Olexandra Dmytrenko
 
PPT
java 8
Unguryan Vitaliy
 
PPT
Java. Полиморфизм.
Unguryan Vitaliy
 
Java. Методы
Unguryan Vitaliy
 
Алгоритмы и структуры данных весна 2014 лекция 2
Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 2
Technopark
 
Stream API
Unguryan Vitaliy
 
Алгоритмы и структуры данных весна 2014 лекция 1
Technopark
 
Collections
DmitryTrushkin
 
алгоритмы stl
mcroitor
 
Java. Массивы. Многомерные массивы.
Unguryan Vitaliy
 
Рекурсия. Поиск
Olexandra Dmytrenko
 
Java. Полиморфизм.
Unguryan Vitaliy
 

Viewers also liked (14)

PPT
Java. Введение в коллекции. Классы обертки. Перечисленияю
Unguryan Vitaliy
 
PPT
Java. Циклы.
Unguryan Vitaliy
 
PPT
Java. Интерфейс Reference - типы ссылок
Unguryan Vitaliy
 
PPT
Java. Инкапсуляция.
Unguryan Vitaliy
 
PPT
Исключения и ошибки
Unguryan Vitaliy
 
PPT
Java. Вложенные классы и интерфейсы.
Unguryan Vitaliy
 
PPT
Java. Наследование.
Unguryan Vitaliy
 
PPT
An Introduction to JVM Internals and Garbage Collection in Java
Abhishek Asthana
 
PPT
Java. Generic - шаблонные типы.
Unguryan Vitaliy
 
PPT
Java. Конструкторы класса и инициализация
Unguryan Vitaliy
 
PPT
Java. Сборщик мусора. Работа с памятью.
Unguryan Vitaliy
 
PPT
Java. Логические операторы, операторы ветвления.
Unguryan Vitaliy
 
PPT
Java. Cистемы счислния, битовые операции
Unguryan Vitaliy
 
Java. Введение в коллекции. Классы обертки. Перечисленияю
Unguryan Vitaliy
 
Java. Циклы.
Unguryan Vitaliy
 
Java. Интерфейс Reference - типы ссылок
Unguryan Vitaliy
 
Java. Инкапсуляция.
Unguryan Vitaliy
 
Исключения и ошибки
Unguryan Vitaliy
 
Java. Вложенные классы и интерфейсы.
Unguryan Vitaliy
 
Java. Наследование.
Unguryan Vitaliy
 
An Introduction to JVM Internals and Garbage Collection in Java
Abhishek Asthana
 
Java. Generic - шаблонные типы.
Unguryan Vitaliy
 
Java. Конструкторы класса и инициализация
Unguryan Vitaliy
 
Java. Сборщик мусора. Работа с памятью.
Unguryan Vitaliy
 
Java. Логические операторы, операторы ветвления.
Unguryan Vitaliy
 
Java. Cистемы счислния, битовые операции
Unguryan Vitaliy
 
Ad

Similar to List - списки (15)

PPTX
Java Core. Lecture# 4. Collections.
Anton Moiseenko
 
PDF
Абстрактные типы данных, последовательности, списки
Olga Maksimenkova
 
PDF
Абстрактные типы данных. Списки
Olga Maksimenkova
 
PDF
Абстрактные типы данных, контейнеры и списки
Olga Maksimenkova
 
PDF
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Nikolay Grebenshikov
 
PPTX
Binary Studio Academy 2016. Data structures and LINQ
Binary Studio
 
PDF
Lec 4
Alexander Rusin
 
PDF
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 
PDF
C++ Базовый. Занятие 07.
Igor Shkulipa
 
PDF
лек9 10
Anastasia Snegina
 
PPT
списки (2008)
vivalis2010
 
PPT
лекция 4
Zhanna Kazakova
 
PPTX
Android - 03 - Multithreading, Collections
Noveo
 
PDF
ОПК № 5 – Составные типы данных, списки
Vladimir Parfinenko
 
PDF
05 - Java. Collections Framework и Generics
Roman Brovko
 
Java Core. Lecture# 4. Collections.
Anton Moiseenko
 
Абстрактные типы данных, последовательности, списки
Olga Maksimenkova
 
Абстрактные типы данных. Списки
Olga Maksimenkova
 
Абстрактные типы данных, контейнеры и списки
Olga Maksimenkova
 
Лекция №5. Линейные структуры данных. Предмет "Структуры и алгоритмы обработк...
Nikolay Grebenshikov
 
Binary Studio Academy 2016. Data structures and LINQ
Binary Studio
 
Лекция 3: Бинарный поиск. Связные списки
Mikhail Kurnosov
 
C++ Базовый. Занятие 07.
Igor Shkulipa
 
лек9 10
Anastasia Snegina
 
списки (2008)
vivalis2010
 
лекция 4
Zhanna Kazakova
 
Android - 03 - Multithreading, Collections
Noveo
 
ОПК № 5 – Составные типы данных, списки
Vladimir Parfinenko
 
05 - Java. Collections Framework и Generics
Roman Brovko
 
Ad

More from Unguryan Vitaliy (20)

PPT
Модульное тестирование.
Unguryan Vitaliy
 
PPT
Архитектурный шаблон MVC
Unguryan Vitaliy
 
PPT
Работа в команде, управление программными проектами
Unguryan Vitaliy
 
PPT
Системы контроля версий
Unguryan Vitaliy
 
PPT
Принципы SOLID
Unguryan Vitaliy
 
PPT
Парадигма объектно-ориентированного программирования.
Unguryan Vitaliy
 
PPT
Введение в язык программирования «Java»
Unguryan Vitaliy
 
PDF
Шаблоны проектирования GoF
Unguryan Vitaliy
 
PPT
Ввведение в java
Unguryan Vitaliy
 
PPT
Введение в hibernate
Unguryan Vitaliy
 
PPT
Spring AOP
Unguryan Vitaliy
 
PPT
Введение в Spring
Unguryan Vitaliy
 
PPT
Cookies, session и другое в JSP
Unguryan Vitaliy
 
PPT
Сервлеты
Unguryan Vitaliy
 
PPT
Сетевое взаимодействие
Unguryan Vitaliy
 
PPT
Введение в сетевые технологии
Unguryan Vitaliy
 
Модульное тестирование.
Unguryan Vitaliy
 
Архитектурный шаблон MVC
Unguryan Vitaliy
 
Работа в команде, управление программными проектами
Unguryan Vitaliy
 
Системы контроля версий
Unguryan Vitaliy
 
Принципы SOLID
Unguryan Vitaliy
 
Парадигма объектно-ориентированного программирования.
Unguryan Vitaliy
 
Введение в язык программирования «Java»
Unguryan Vitaliy
 
Шаблоны проектирования GoF
Unguryan Vitaliy
 
Ввведение в java
Unguryan Vitaliy
 
Введение в hibernate
Unguryan Vitaliy
 
Spring AOP
Unguryan Vitaliy
 
Введение в Spring
Unguryan Vitaliy
 
Cookies, session и другое в JSP
Unguryan Vitaliy
 
Сервлеты
Unguryan Vitaliy
 
Сетевое взаимодействие
Unguryan Vitaliy
 
Введение в сетевые технологии
Unguryan Vitaliy
 

List - списки

  • 2. Списки - List Интерфейс java.util.List<E> служит для описания списков. Данный интерфейс определяет поведение коллекций, которые служат для хранения упорядоченного набора объектов. Порядок в котором хранятся элементы определяется порядком их добавления в список.
  • 3. List Коллекции, реализующие интерфейс java.util.List<E> могут хранить 1, 2 и более копий одного и того же объекта (ссылки на объект). Может хранить null.
  • 5. ArrayList ArrayList - самая часто используемая коллекция. ArrayList инкапсулирует в себе обычный массив, длина которого автоматически увеличивается при добавлении новых элементов. Так как ArrayList использует массив, то время доступа к элементу по индексу минимально.
  • 6. Пример ArrayList List list = new ArrayList(); list.add(“Васька”); list.add(3); Object object = list.get(0); List<String> catNames = new ArrayList<>(5); catNames.add(“Васька”); String name = catNames.get(0);
  • 7. new ArrayList Только что созданный объект списка (list), содержит свойства elementData и size. Хранилище значений elementData — это массив определённого типа (указанного в generic).
  • 8. new ArrayList Если вызывается конструктор без параметров, то по умолчанию будет создан массив из 10-ти элементов типа Object (с приведением к типу, разумеется). Вы можете использовать конструктор ArrayList(capacity) и указать свою начальную ёмкость списка.
  • 9. Изменение ArrayList При удалении произвольного элемента из списка, все элементы находящиеся «правее» смещаются на одну ячейку влево, при этом реальный размер массива (его ёмкость, capacity) не изменяется.
  • 10. Изменение ArrayList Если при добавлении элемента, оказывается, что массив полностью заполнен, будет создан новый массив размером (n * 3) / 2 + 1, в него будут помещены все элементы из старого массива + новый, добавляемый элемент.
  • 11. Метод add(E element) Внутри метода add(value) происходят следующие вещи: 1.Проверяется, достаточно ли места в массиве для вставки нового элемента ensureCapacity(size + 1);; 2.добавляется элемент в конец (согласно значению size) массива.
  • 12. ensureCapacity(minCapacity) Если места в массиве не достаточно, новая емкость рассчитывается по формуле (oldCapacity * 3) / 2 + 1. Копирование элементов осуществляется с помощью native метода System.arraycopy().
  • 13. Выделение дополнительной памяти При добавлении 11-го элемента, проверка показывает что места в массиве нет. Соответственно создаётся новый массив и вызывается System.arraycopy().
  • 14. Добавление в середину списка 1. Проверяется, достаточно ли места в массиве для вставки нового элемента; 2. Подготавливается место для нового элемента с помощью System.arraycopy(); 1. Пере записывается значение у элемента с указанным индексом.
  • 15. Удаление элементов Удалять элементы можно двумя способами: — по индексу remove(index) Пример : list.remove(5); — по значению remove(value) Пример : list.remove(“Dog”); При удалении элементов текущая величина capacity не уменьшается, что может привести к своеобразным утечкам памяти. Поэтому не стоит пренебрегать методом trimToSize().
  • 16. RandomAccess Маркерный интерфейс для указания, что реализации поддерживают произвольный доступ.
  • 17. Итоги по ArrayList Быстрый доступ к элементам по индексу за время O(1);  Доступ к элементам по значению за линейное время O(n);  Медленный, когда вставляются и удаляются элементы из «середины» списка;  Позволяет хранить любые значения в том числе и null;  Не синхронизирован.
  • 19. LinkedList LinkedList — это двусвязный список. Это структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и две ссылки («связки») на следующий и предыдущий узел списка.
  • 20. LinkedList Доступ к произвольному элементу осуществляется за линейное время (но доступ к первому и последнему элементу списка всегда осуществляется за константное время — ссылки постоянно хранятся на первый и последний.
  • 21. new LinkedList Только что созданный объект list, содержит свойства header и size.
  • 22. new LinkedList Header — псевдо-элемент списка. Его значение всегда равно null, а свойства next и prev всегда указывают на первый и последний элемент списка соответственно. Так как на момент создания список пуст, свойства next и prev указывают сами на себя (т.е. на элемент header). Размер списка size равен 0.
  • 23. Добавление элементов Добавление элемента в конец списка с помощью методом add(value), addLast(value) и добавление в начало списка с помощью addFirst(value) выполняется за время O(1). Внутри класса LinkedList существует внутренний статический класс Entry, с помощью которого создаются новые элементы.
  • 24. Добавление элемента 1. Создается новый новый экземпляр класса Entry 1. Переопределяются указатели на предыдущий и следующий элемент
  • 26. Добавление элементов в «середину» списка Для того чтобы добавить элемент на определённую позицию в списке, необходимо вызвать метод add(index, value). Отличие от add(value) состоит в определении элемента перед которым будет производиться вставка.
  • 28. Удаление элементов Удалять элементы из списка можно несколькими способами: — из начала или конца списка с помощью removeFirst(), removeLast() за время O(1); — по индексу remove(index) и по значению remove(value) за время O(n).
  • 29. Удаление элемента 1. Поиск первого элемента с соответствующим значением 2. Переопределяются указатели на предыдущий и следующий элемент
  • 30. Итоги LinkedList Из LinkedList можно организовать стэк, очередь, или двойную очередь, со временем доступа O(1);  На вставку и удаление из середины списка, получение элемента по индексу или значению потребуется линейное время O(n). Однако, на добавление и удаление из середины списка, используя ListIterator.add() и ListIterator.remove(), потребуется O(1);
  • 31. Итоги LinkedList Позволяет добавлять любые значения в том числе и null. Для хранения примитивных типов использует соответствующие классы- оберки;  Не синхронизирован.
  • 32. LinkedList vs ArrayList Добавлени элемента в конец списка: ArrayList немного проигрывает, за счет необходимости выделения памяти для новых элементов. Удаление элемента из конца списка: Тут ничья
  • 33. LinkedList vs ArrayList Добавление и удаление в начале списка С небольшим отрывом выигрывает LinkedList Добавление и удаление элементов в середину списка Выигрывает LinkedList, но с оговорками.
  • 34. LinkedList vs ArrayList Получение элемента из середине списка LinkedList в накауте, ArrayList пожинает лавры. Количество добавляемых элементов ArrayList ограничен Integer.MAX_VALUE В целом же, LinkedList в абсолютных величинах проигрывает ArrayList и по потребляемой памяти и по скорости выполнения операций.