Коллекции Flashcards
Какие данные могут хранить коллекции
Коллекции могут хранить любые ссылочные типы данных
коллекция
Коллекции это классы, основная цель которых – хранить набор других элементов.
List
List — это упорядоченный список.
Объекты хранятся в порядке их добавления в список.
Доступ к элементам списка осуществляется по индексу.
Set
Set — множество уникальных объектов.
В коллекции этого типа разрешено наличие только одной ссылки типа null.
Queue
Queue — коллекция, предназначенная для хранения элементов в порядке, нужном для их обработки.
В дополнение к базовым операциям интерфейса Collection, очередь предоставляет дополнительные операции вставки, получения и контроля.
основные реализации List
ArrayList Список
LinkedList Список
Vector Вектор
Stack Стек
основные реализации Set
HashSet Множество
TreeSet Множество
SortedSet (расширяющий интерфейс Отсортированное
множество
основные реализации Map.
HashMap Карта/Словарь
TreeMap Карта/Словарь
SortedMap (расширяющий интерфейс) Отсортированный
словарь
Hashtable Хеш-таблица
реализации SortedSet
java.util.SortedSet<E> наследует java.util.Set<E>.</E></E>
Реализации: java.util.TreeSet<E></E>
java.util.SortedSet<E></E>
Реализации этого интерфейса, помимо того что следят за уникальностью хранимых объектов, поддерживают их в порядке возрастания. Отношение порядка между объектами может быть определено, как с помощью метода compareTo интерфейса java.lang.Comparable<T>, так и при помощи специального класса-компаратора, наследующего интерфейс java.util.Comparator<T>.</T></T>
java.util.TreeSet<E></E>
коллекция, которая хранит свои элементы в виде упорядоченного по значениям дерева. TreeSet инкапсулирует в себе TreeMap, который в свою очередь использует сбалансированное бинарное красно-черное дерево для хранения элементов. TreeSet хорош тем, что для операций add, remove и contains потребуется гарантированное время log(n).
В чем отличия/сходства List и Set?
Оба унаследованы от Collection, а значит имеют одинаковый набор и сигнатуры методов. List хранит объекты в порядке вставки, элемент можно получить по индексу. Set не может хранить одинаковых элементов.
Что разного/общего у классов ArrayList и LinkedList, когда лучше использовать ArrayList, а когда LinkedList?
ArrayList реализован внутри в виде обычного массива. Поэтому при вставке элемента в середину, приходится сначала сдвигать на один все элементы после него, а уже затем в освободившееся место вставлять новый элемент. Зато в нем быстро реализованы взятие и изменение элемента – операции get, set, так как в них мы просто обращаемся к соответствующему элементу массива.
LinkedList реализован внутри по-другому. Он реализован в виде связного списка: набора отдельных элементов, каждый из которых хранит ссылку на следующий и предыдущий элементы. Чтобы вставить элемент в середину такого списка, достаточно поменять ссылки его будущих соседей. А вот чтобы получить элемент с номером 130, нужно пройтись последовательно по всем объектам от 0 до 130. Другими словами операции set и get тут реализованы очень медленно.
Если необходимо вставлять (или удалять) в середину коллекции много элементов, то лучше использовать LinkedList. Во всех остальных случаях – ArrayList.
LinkedList требует больше памяти для хранения такого же количества элементов, потому что кроме самого элемента хранятся еще указатели на следующий и предыдущий элементы списка, тогда как в ArrayList элементы просто идут по порядку
В каких случаях разумно использовать массив, а не ArrayList?
Если коротко, то Oracle пишет — используйте ArrayList вместо массивов. Если ответить на этот вопрос нужно по-другому, то можно сказать следующее: массивы могут быть быстрее и кушать меньше памяти. Списки теряют в производительности из-за возможности автоматического увеличения размера и сопутствующих проверок. Плюс к этому, что размер списка увеличивается не на 1, а на большее кол-во элементов (+15)*. Так же доступ к [10] в массиве может быть быстрее чем вызов get(10) у списка.
*Читатель прислал комментарий «У ArrayList увеличение происходит в 1.5 раза. int newCapacity = oldCapacity + (oldCapacity»_space; 1);».
Чем отличается ArrayList от Vector?
Vector deprecated. У Vector некоторые методы синхронизированы и поэтому они медленные. В любом случае Vector не рекомендуется использовать вообще.