Карта / Big-O / Сравнение структур

Сравнение структур

Когда выбираешь структуру данных под задачу, главный вопрос — какая операция будет выполняться чаще всего. Сводная таблица по уже знакомым структурам (детальнее — в теме «Сложность O(1) vs O(n)»):

СтруктураПоиск по значениюДоступ по индексуВставка в началоСохраняет порядок добавления
ArrayListO(n)O(1)O(n)да
LinkedListO(n)O(n)O(1)да
HashMap/HashSetO(1)нет
TreeMap/TreeSetO(log n)да, отсортированный
Копнуть глубже

Как выбирать на практике — три вопроса:

  1. Нужен ли быстрый поиск “есть ли это значение”?HashSet/HashMap.
  2. Нужен ли порядок (отсортированный или вставки)?TreeMap/TreeSet (отсортированный) или ArrayList/LinkedList (порядок вставки).
  3. Много ли вставок в начало/середину?LinkedList. Если нет — почти всегда ArrayList лучше по умолчанию.

Частая ошибка новичков — использовать ArrayList.contains() там, где нужен HashSet.contains(): на маленьких данных разницы не видно, но при росте коллекции до тысяч элементов O(n)-поиск в списке начинает заметно тормозить программу.

🎤 Закрыл тему, если можешь объяснить:
• по какому критерию выбирать структуру данных под задачу;
• почему `ArrayList.contains()` в цикле — частая ошибка производительности (если дошёл до 2-го слоя).