Set
Что это
Set(множество) - коллекция в которой элементы хранится только в одном экземпляре, а разные реализации Set
используют разный порядок хранения элементов.
Особенности
- Не возможны дубликаты.
- Не имеет методов для получения элементов.
Основные реализации
- HashSet
- TreeSet
- LinkedHashSet
- CopyOnWriteArraySet - это потокобезопасный вариант of ArrayList, но буз дубликатов. Разница в том,
что все мутативные операции, такие как add, set, remove, clear... создают новую копию массива.
- ConcurrentSkipListSet - set на базе ConcurrentSkipListMap.
HashSet
HashSet - реализация Set, которая не хранит дубликатов.
Особенности
Внутри использует HashMap(значение помещается в Key а в Value объект пустышка(new Object())).
Элементы хранятся в односвязном списке.
Метод add() возвращает true - был ли заменён объект.
Позволяет добавить (null).
Set
Как получить значение из Hashset? Вызвать его Iterator или использовать метод toArray()
Сложность алгоритмов
- Получение - если нет коллизии - O(1), если есть коллизия O(n).
- Вставить - если нет коллизии - O(1), если есть коллизия O(n).
- Удаление - если нет коллизии - O(1), если есть коллизия O(n).
TreeSet
TreeSet - хранение уникальных значений в сортированном виде. Реализует красно-чёрное дерево.
Сложность алгоритмов TreeSet
- Получение - если первый элемент - O(1), если не первый O(log(n)).
- Вставить - O(log(n)).
- Удаление - O(log(n)).
Разница HashSet и TreeSet? - TreeSet на основе дерева. При добавлении сортирует. Для добавления
необходимо передать Comparator или чтобы его элементы реализовывали Comparable.
LinkedHashSet
LinkedHashSet - HashSet в порядке добавления. В основе лежит LinkedHashMap вместо HashMap.
Разница HashSet и LinkedHashSet? - LinkedHashSet хранит записи в порядке добавления, двухсвязный список.