Вопрос с собеседования · Java

Нужна очередь FIFO внутри одного потока. Что выбрать по умолчанию?

MiddleКоллекции
Коротко

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?
  • Что выбрать для передачи задач между потоками?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования