
- •Структуры данных в картинках
- •ArrayList (список)
- •LinkedList (двунаправленный список)
- •HashSet (смотреть HashMap)
- •LinkedHashSet (смотреть LinkedHashMap)
- •Создание объекта
- •Создание объекта
- •Добавление элементов
- •Удаление элементов
- •Итераторы
- •Устаревшие коллекции
- •Вопросы:
- •Расскажите о ArrayList или LinkedList. Чем они отличаются?
Collections Hierarchy
http://www.quizful.net/post/Java-Collections
List Hierarchy
Красным здесь выделены интерфейсы, зеленым - абстрактные классы, а синим готовые реализации. Сразу хочу заметить что здесь не вся иерархия, а только основная её часть.
Set Hierarchy
Queue Hierarchy
Map Hierarchy
Интерфейс Map соотносит уникальные ключи со значениями. Ключ — это объект, который вы используете для последующего извлечения данных. Задавая ключ и значение, вы можете помещать значения в объект карты. После того как это значение сохранено, вы можете получить его по ключу. Интерфейс Map — это обобщенный интерфейс, объявленный так, как показано ниже.
interface Мар<К, V>
Здесь К указывает тип ключей, а V — тип хранимых значений.
Иерархия классов очень похожа на иерархию Set'а.
Структуры данных в картинках
ArrayList (список)
ArrayList - пожалуй самая часто используемая коллекция. ArrayList инкапсулирует в себе обычный массив, длина которого автоматически увеличивается при добавлении новых элементов.
Так как ArrayList использует массив, то время доступа к элементу по индексу минимально (В отличии от LinkedList). При удалении произвольного элемента из списка, все элементы находящиеся «правее» смещаются на одну ячейку влево, при этом реальный размер массива (его емкость, capacity) не изменяется. Если при добавлении элемента, оказывается, что массив полностью заполнен, будет создан новый массив размером (n * 3) / 2 + 1, в него будут помещены все элементы из старого массива + новый, добавляемый элемент. http://habrahabr.ru/post/128269/
Создание объекта
ArrayList<String> list = new ArrayList<String>();
elementData - <String>
capacity – 10 элементов (по умолчанию), формула: (oldCapacity*3)/2+1
size – текущее количество элементов
Добавление элементов
list.add("0");
list.add("14");
Добавление в «середину» списка
list.add(5, "100");
System.arraycopy();
Удаление элементов
Удалять элементы можно двумя способами:
— по индексу remove(index)
list.remove(5);
— по значению remove(value)
list.remove(new Integer(5));
При удалении по значению, в цикле просматриваются все элементы списка, до тех пор пока не будет найдено соответствие. Удален будет лишь первый найденный элемент.
p.s. при удалении элементов текущая величина capacity не уменьшается, что может привести к своеобразным утечкам памяти. Поэтому не стоит пренебрегать методом trimToSize().
Summary:
Свойства:
Не синхронизирован
Упорядочен (по индексам)
С дублированием элементов
Не отсортирован
Позволяет хранить любые значения в том числе и null
Преимущества:
Быстрый доступ к элементам по индексу за время O(1);
Вставка в конец списка за время O(1);
Недостатки:
Доступ к элементам по значению за линейное время O(n);
Вставка и удаление элементов из «середины» и «начала» списка
время выполнения contains() = O(n)
LinkedList (двунаправленный список)
LinkedList - Двусвязный список. Это структура данных, состоящая из узлов, каждый из которых содержит как собственно данные, так и две ссылки («связки») на следующий и предыдущий узел списка. Доступ к произвольному элементу осуществляется за линейное время (но доступ к первому и последнему элементу списка всегда осуществляется за константное время — ссылки постоянно хранятся на первый и последний, так что добавление элемента в конец списка вовсе не значит, что придется перебирать весь список в поисках последнего элемента). В целом же, LinkedList в абсолютных величинах проигрывает ArrayList и по потребляемой памяти и по скорости выполнения операций. http://habrahabr.ru/post/127864/
Создание объекта
List<String> list = new LinkedList<String>();
header - псевдо-элемент списка, он содержит три поля:
element (null по умолчанию)
next
prev
size – текущее количество элементов
Добавление элементов
list.add("0"); (и addLast() – в конец списка; addFirst() - в начало)
Внутри класса LinkedList существует static inner класс Entry, с помощью которого создаются новые элементы.
создается новый новый экземпляр класса Entry
переопределяются указатели на предыдущий и следующий элемент
Добавление в «середину» списка
add(index, value);
list.add(1, "100");
происходит определение элемента перед которым будет производиться вставка, занимает половину списка (формула: (index<(size>>1)))
Удаление элементов
Удалять элементы можно двумя способами:
— из начала или конца списка за время O(1):
removeFirst(),
removeLast()
— по индексу за время O(n):
remove(index) и
— по значению за время O(n):
remove(value)
При удалении по значению, в цикле просматриваются все элементы списка, до тех пор пока не будет найдено соответствие. Удален будет лишь первый найденный элемент.
Удаление по значению, пример:
list.remove("100");
поиск первого элемента с соответствующим значением
переопределяются указатели на предыдущий и следующий элемент
удаление (=null) указателей у удаляемого элемента (будет удален GC-ором)
Summary:
Свойства:
Не синхронизирован
Упорядочен (по индексам)
С дублированием элементов
Не отсортирован
Позволяет хранить любые значения в том числе и null
Преимущества:
Быстрый доступ к первому и последнему элементам за время O(1);
Вставка в конец списка и в начало за время O(1);
Вставка (добавление и удаление из середины списка), используя ListIterator.add() и ListIterator.remove(), потребуется O(1) (если указатель итератора уже находится на нужном месте);
Недостатки:
Вставка, удаление, получение элемента по индексу или значению из середины занимает линейное время O(n). Однако, на добавление и удаление из середины списка, используя ListIterator.add() и ListIterator.remove(), потребуется O(1) (если указатель итератора уже находится на нужном месте);
По факту получается что для нахождения нужного элемента перебирается не больше половины списка, но с точки зрения асимптотического анализа время на поиск растет линейно — O(n).
время выполнения contains() = O(n)