Нужна очередь FIFO внутри одного потока. Что выбрать по умолчанию?
ArrayDeque: кольцевой массив, offer и poll — O(1), без узла на элемент и промахов кэша.
- LinkedList — тоже Deque, но медленнее
- ArrayList для очереди не годится: удаление из начала сдвигает всё
- Между потоками — блокирующие очереди
А ещё Null-элементы недопустимы
Подробно
LinkedList действительно реализует Deque, но платит объектом-узлом за каждый элемент и разбросанностью по куче. ArrayDeque хранит элементы в кольцевом массиве, поэтому добавление и снятие с обоих концов константны и дружелюбны к кэшу. ArrayList для очереди не годится: удаление из начала сдвигает весь хвост. PriorityQueue — это куча, она выдаёт элементы по приоритету, а не в порядке поступления, и порядок её итератора вообще не определён. Ограничения ArrayDeque стоит знать: он не допускает null-элементов и не является потокобезопасным — для обмена между потоками берут реализации BlockingQueue.
Что хотят услышать
- Выбор ArrayDeque и почему не LinkedList и ArrayList.
Частые ошибки
- Использовать ArrayList как очередь.
- Ожидать от PriorityQueue порядка FIFO или упорядоченной итерации.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓ArrayDeque — кольцевой буфер
- ✗LinkedList, потому что он реализует Deque и специально оптимизирован под очередь
- ✗ArrayList с удалением из начала
- ✗PriorityQueue без компаратора
Что спросят дальше
- Почему ArrayDeque запрещает null?
- Что выбрать для передачи задач между потоками?
Разбор темы
- LinkedList и миф о дешёвой вставке
Двусвязные узлы, реальная стоимость операций, cache locality и почему ArrayList/ArrayDeque почти всегда лучше.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.