Какие коллекции в Java вы чаще всего используете и почему?
Что проверяют
Понимаете ли вы, что стоит за интерфейсом, или выучили, что «список это ArrayList». По ответу видно, думаете ли вы про сложность операций, память и многопоточность. Следом почти всегда идёт уточнение: что происходит внутри HashMap при коллизиях и почему объект-ключ обязан быть неизменяемым.
Как отвечать
Отвечайте от задачи, а не от списка классов:
ArrayList: массив под капотом, доступ по индексу за O(1), добавление в конец амортизированно O(1), вставка и удаление в середине за O(n) со сдвигом черезSystem.arraycopy;LinkedList: O(1) только когда узел уже в руках (итератор, начало, конец), доступ по индексу за O(n), каждый элемент это отдельный объект с двумя ссылками. Обычно проигрывает из-за промахов кэша;ArrayDeque: очередь и стек, быстрееLinkedListи старогоStackс ненужной синхронизацией;HashMap: массив бакетов, ёмкость по умолчанию 16 иloadFactor0.75, при восьми элементах в бакете и таблице от 64 цепочка становится красно-чёрным деревом. Ключ обязан правильно реализовыватьequalsиhashCodeи не меняться после вставки;LinkedHashMap: порядок вставки или обращения, черезremoveEldestEntryсобирается LRU-кэш;TreeMapиTreeSet: красно-чёрное дерево, O(log n), берут радиNavigableMap:floorKey,headMap, диапазоны;ConcurrentHashMap: конкурентный доступ плюс атомарныеcomputeиmerge, тогда какCollections.synchronizedMapблокирует целиком.
Полезно добавить про неизменяемые List.of и Map.of из Java 9 и SequencedCollection из Java 21 с getFirst и reversed.
Где спотыкаются
Повторяют миф «нужны частые вставки, значит LinkedList». Замер показывает обратное: поиск позиции всё равно линейный, а память и разыменования съедают выигрыш.
Забывают equals и hashCode у своего класса-ключа или кладут в HashSet изменяемый объект. Элемент потом не находится, хотя физически он там лежит.
Удаляют элементы в цикле for-each и получают ConcurrentModificationException вместо Iterator.remove или removeIf. Рядом ещё две ловушки: Arrays.asList возвращает список фиксированного размера, а List.of не принимает null.