Сравним коллекции Java по следующим параметрам:
На чем основана — какая структура данных или коллекция используется под капотом.
Дубли — разрешены или нет в коллекции повторяющиеся значения.
Null — позволяет ли коллекция вставлять null.
Синхронизированность — все ли методы коллекции синхронизированы.
Потокобезопасность — безопасно ли использовать коллекцию в многопоточной среде.
Тип итератора — поведение итератора в многопоточной среде.
Базовый интерфейс |
Тип коллекции |
На чем основана |
Дубли |
Null |
Синхрони- зированность |
Потоко- безопасность |
Тип итератора |
List |
ArrayList<E> |
Массив |
Да |
Да |
Нет |
Нет |
Быстрое падение |
LinkedList<E> |
Двусвязный список |
Нет |
Нет |
Быстрое падение |
|||
CopyOnWriteArrayList<E> |
Массив |
Нет |
Да |
Моментальный снимок |
|||
Vector<E> |
Массив |
Да |
Да |
Быстрое падение |
|||
Stack<E> |
Массив |
Да |
Да |
Быстрое падение |
|||
Queue |
ConcurrentLinkedQueue<E> |
Односвязный список |
Да |
Нет |
Нет |
Да |
Слабая согласованность |
PriorityQueue<E> |
Сбалансированная двоичная куча, основанная на массиве |
Нет |
Нет |
Быстрое падение |
|||
LinkedBlockingQueue<E> |
Односвязный список |
Нет |
Да |
Слабая согласованность |
|||
PriorityBlockingQueue<E> |
Сбалансированная двоичная куча, основанная на массиве |
Нет |
Да |
Моментальный снимок |
|||
ArrayBlockingQueue<E> |
Массив фиксированного размера |
Нет |
Да |
Слабая согласованность |
|||
DelayQueue<E> |
PriorityQueue<E> |
Нет |
Нет |
Моментальный снимок |
|||
SynchronousQueue<E> |
Ничего не хранит, нулевая емкость |
Нет |
Да |
Collections.emptyIterator |
|||
LinkedTransferQueue<E> |
Односвязный список |
Нет |
Да |
Слабая согласованность |
|||
ArrayDeque<E> |
Массив |
Нет |
Нет |
Быстрое падение |
|||
ConcurrentLinkedDeque<E> |
Двусвязный список |
Нет |
Да |
Слабая согласованность |
|||
LinkedBlockingDeque<E> |
Двусвязный список |
Нет |
Да |
Слабая согласованность |
|||
Map |
HashMap<K,V> |
Хеш-таблица |
Для значений |
Для ключей и значений |
Нет |
Нет |
Быстрое падение |
LinkedHashMap<K,V> |
Хеш-таблица + двусвязный список |
Для ключей и значений |
Нет |
Нет |
Быстрое падение |
||
TreeMap<K,V> |
Красно-чёрное дерево |
Нельзя использовать null в ключах, если используется естественная сортировка или компаратор не принимает null |
Нет |
Нет |
Быстрое падение |
||
ConcurrentHashMap<K,V> |
Хеш-таблица |
Нет |
Нет |
Да |
Отражает состояние на какой-то момент времени после создания |
||
ConcurrentSkipListMap<K,V> |
Список с пропусками |
Для значений |
Нет |
Да |
Слабая согласованность |
||
WeakHashMap<K,V> |
Хеш-таблица |
Для ключей и значений |
Нет |
Нет |
Быстрое падение |
||
IdentityHashMap<K,V> |
Хеш-таблица |
Для ключей и значений |
Нет |
Нет |
Быстрое падение |
||
EnumMap<K,V> |
Массив |
Для значений |
Нет |
Нет |
Слабая согласованность |
||
Hashtable<K,V> |
Хеш-таблица |
Нет |
Да |
Да |
Быстрое падение |
||
Properties |
ConcurrentHashMap |
Нет |
Да |
Да |
Не гарантированное быстрое падение |
||
Set |
HashSet<E> |
HashMap |
Нет |
Да |
Нет |
Нет |
Быстрое падение |
LinkedHashSet<E> |
LinkedHashMap |
Да |
Нет |
Нет |
Быстрое падение |
||
TreeSet<E> |
TreeMap |
Нельзя использовать null в ключах, если используется естественная сортировка или компаратор не принимает null |
Нет |
Нет |
Быстрое падение |
||
EnumSet<E> |
Битовая карта (bit array) |
Нет |
Нет |
Нет |
Слабая согласованность |
||
CopyOnWriteArraySet<E> |
CopyOnWriteArrayList |
Да |
Нет |
Да |
Моментальный снимок |
||
ConcurrentSkipListSet<E> |
ConcurrentSkipListMap |
Нет |
Нет |
Да |
Слабая согласованность |
Общий обзор коллекций Java
Типы итераторов:
Быстрое падение (fail-fast) — итератор при создании сохраняет "номер поколения" коллекции, который является просто количеством изменений, сделанных в коллекции. При итерации сравнивается текущее поколение и сохраненное. Если они отличаются, то бросается исключение
ConcurrentModificationException
.Моментальный снимок (snapshot-style) — итератор сохраняет снимок коллекции и использует его. Исключения
ConcurrentModificationException
никогда не бывает.Слабая согласованность (weakly consistent) — при итерации можно выполнять некоторые изменения коллекции (но гарантий нет). Не бросает
ConcurrentModificationException
.
Приглашаем всех желающих на открытый урок «Перегрузка». Будет рассмотрена перегрузка методов в Java. Как и в реальной жизни: всё окажется на так однозначно! Регистрация доступна по ссылке.
Inine
Столбцы 4 и 5 не влезли. Плюс для такой шпаргалки практически обязателен столбец "применимость" с градацией от "бери не ошибешься" до "забыть и простить".
Lure_of_Chaos
для чего вам широкоэкранные мониторы? /s
столбец нужен, но без градации, а просто случаи. конечно, если хорошо знать всё, что перечислено во 2м столбце... но было бы лучше всё же отдельно расписано
это про Properties что ли?
TheBezik
"Применимость" - Это достаточно субъективный столбец