Как оптимизировать использование коллекций в Java
Что проверяют
Умеете ли вы подбирать структуру под операцию и знаете ли про упаковку и предварительный размер.
Как отвечать
По направлениям, от самого действенного.
1. Правильная структура под операцию. Это даёт порядки, а не проценты:
- проверка вхождения в цикле по списку это квадрат. Замена на
HashSetделает линейным; - очередь с двух концов это
ArrayDeque, а неLinkedList; - ключи-перечисления это
EnumMapиEnumSet, они работают на массивах и битовых масках и заметно быстрее хеш-таблиц; - нужен порядок вставки, значит
LinkedHashMap, нужна сортировка, значитTreeMap, но не платите за них без надобности.
2. Предварительный размер. Если итоговое число элементов примерно известно, задавайте ёмкость в конструкторе. Иначе список несколько раз перевыделит внутренний массив, а хеш-таблица несколько раз перестроится. Для карты ёмкость считается с учётом коэффициента загрузки 0,75.
3. Упаковка. List<Integer> хранит объекты, а не числа: это лишний объект на элемент и разыменование при каждом доступе. В горячем коде берут массивы примитивов или специализированные библиотеки коллекций.
4. Качество hashCode. От него напрямую зависит, будет ли HashMap работать за постоянное время. Плохое распределение превращает её в списки внутри корзин.
5. Неизменяемые коллекции. List.of и Map.of компактнее по памяти, безопасны для передачи наружу и защищают от случайного изменения.
6. Мелочи, которые заметны:
- удаление по условию через
removeIf, а не циклом с индексами; - не копировать коллекцию без необходимости,
new ArrayList<>(other)в цикле это классическая утечка производительности; - не вызывать
size()внутри условия там, где значение не меняется.
Главное правило в конце: измеряйте. Асимптотика подсказывает направление, но решение принимается по профилировщику или замеру, а не по интуиции.
Где спотыкаются
Ищут в списке вместо множества.
Не задают ёмкость при известном размере.
Оптимизируют константы там, где выбрана неверная структура данных.
Переопределяют equals без hashCode и ломают работу хеш-коллекций.