
- •Структуры данных в картинках
- •ArrayList (список)
- •LinkedList (двунаправленный список)
- •HashSet (смотреть HashMap)
- •LinkedHashSet (смотреть LinkedHashMap)
- •Создание объекта
- •Создание объекта
- •Добавление элементов
- •Удаление элементов
- •Итераторы
- •Устаревшие коллекции
- •Вопросы:
- •Расскажите о ArrayList или LinkedList. Чем они отличаются?
Устаревшие коллекции
Следующие коллекции являются устаревшими, и их использование не рекомендуется, но не запрещается.
Enumeration
Enumeration — аналог интерфейса Iterator.
Vector
Vector — аналог класса ArrayList; поддерживает упорядоченный список элементов, хранимых во "внутреннем" массиве.
Stack
Stack — класс, производный от Vector, в который добавлены методы вталкивания (push) и выталкивания (pop) элементов, так что список может трактоваться в терминах, принятых для описания структуры данных стека (stack).
Dictionary
Dictionary — аналог интерфейса Map, хотя представляет собой абстрактный класс, а не интерфейс.
Hashtable
Hashtable — аналог HashMap.
Все методы Hashtable, Stack, Vector являются синхронизированными, что делает их менее эффективными в одно поточных приложениях.
Вопросы:
Расскажите о ArrayList или LinkedList. Чем они отличаются?
ArrayList это список, реализованный на основе массива, а LinkedList — это классический связный список, основанный на объектах с ссылками между ними.
Скорость работы зависит от выполняемых операций над объектом.
Преимущества ArrayList: в возможности доступа к произвольному элементу по индексу за постоянное время (так как это массив), минимум накладных расходов при хранении такого списка, вставка в конец списка в среднем производится так же за постоянное время.
При удалении произвольного элемента из списка, все элементы находящиеся «правее» смещаются на одну ячейку влево, при этом реальный размер массива (его емкость, capacity) не изменяется.
Для эффективного удаления из ArraList нужно выполнить смещение всех элементов, стоящих «правее» n+m позиции на n элементов левее к началу списка. Таким образом, вместо выполнения n итераций перемещения элементов списка, все выполняется за 1 проход.
LinkedList наоборот, за постоянное время может выполнять вставку/удаление элементов в списке. Доступ к произвольному элементу осуществляется за линейное время.
В целом же, LinkedList в абсолютных величинах проигрывает ArrayList и по потребляемой памяти и по скорости выполнения операций. LinkedList предпочтительно применять, когда происходит активная работа (вставка/удаление) с серединой списка или в случаях, когда необходимо гарантированное время добавления элемента в список.