← Назад к вопросам

Как называется интерфейс "первым вошел - первым вышел"

1.0 Junior🔥 131 комментариев
#Коллекции

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Queue интерфейс - "первым вошел - первым вышел"

Основное определение

Интерфейс, который реализует принцип FIFO (First In First Out) — это Queue<E>. Это стандартная коллекция в Java Collections Framework.

Иерархия

Collection<E>
    |
    +-- Queue<E> (java.util.Queue)
            |
            +-- Deque<E> (двусторонняя очередь)
            +-- BlockingQueue<E> (потокобезопасная)
            +-- PriorityQueue<E> (приоритетная)

Queue интерфейс

public interface Queue<E> extends Collection<E> {
    // Добавление элемента
    boolean add(E e);           // Бросает исключение если полная
    boolean offer(E e);         // Возвращает false если полная
    
    // Удаление элемента
    E remove();                 // Бросает NoSuchElementException если пуста
    E poll();                   // Возвращает null если пуста
    
    // Просмотр первого элемента
    E element();                // Бросает NoSuchElementException если пуста
    E peek();                   // Возвращает null если пуста
}
МетодИсключениеВозвращает null
add()
offer()
remove()
poll()
element()
peek()

Примеры реализаций Queue

LinkedList (очередь FIFO)

Queue<String> queue = new LinkedList<>();

queue.add("Alice");      // Добавить в конец
queue.add("Bob");
queue.add("Charlie");

String first = queue.poll();  // Получить из начала: Alice
first = queue.poll();         // Bob
first = queue.poll();         // Charlie

ArrayDeque (два конца)

Queue<Integer> queue = new ArrayDeque<>();

queue.offer(1);
queue.offer(2);
queue.offer(3);

queue.poll();   // 1
queue.poll();   // 2
queue.poll();   // 3

PriorityQueue (приоритетная очередь)

Queue<Integer> pq = new PriorityQueue<>();  // MIN-heap по умолчанию

pq.add(3);
pq.add(1);
pq.add(2);

pq.poll();  // 1
pq.poll();  // 2
pq.poll();  // 3

LinkedBlockingQueue (потокобезопасная)

Queue<String> queue = new LinkedBlockingQueue<>(100);

// Потокобезопасное добавление
queue.put("Message 1");  // Блокирует если полная
queue.offer("Message 2", 5, TimeUnit.SECONDS);  // Таймаут

// Потокобезопасное получение
String msg = queue.take();  // Блокирует если пуста
msg = queue.poll(5, TimeUnit.SECONDS);  // Таймаут

Практические примеры

Task Scheduler

public class TaskScheduler {
    private final Queue<Task> taskQueue = new LinkedList<>();
    
    public void schedule(Task task) {
        taskQueue.offer(task);  // Добавить задачу
    }
    
    public void processTasks() {
        while (!taskQueue.isEmpty()) {
            Task task = taskQueue.poll();  // Обработать в порядке FIFO
            if (task != null) {
                task.execute();
            }
        }
    }
}

Message Queue (конкурентная)

public class MessageBroker {
    private final BlockingQueue<Message> queue = new LinkedBlockingQueue<>();
    
    public void publish(Message msg) throws InterruptedException {
        queue.put(msg);  // Производитель добавляет
    }
    
    public void subscribe() throws InterruptedException {
        while (true) {
            Message msg = queue.take();  // Потребитель берёт
            processMessage(msg);
        }
    }
}

BFS (поиск в ширину) в графе

public void bfs(Graph graph, Node start) {
    Queue<Node> queue = new LinkedList<>();
    queue.add(start);
    
    while (!queue.isEmpty()) {
        Node node = queue.poll();
        System.out.println(node.value);
        
        for (Node neighbor : node.neighbors) {
            queue.add(neighbor);
        }
    }
}

Отличие Queue от Deque

Queue — односторонняя очередь:

Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
queue.poll();  // 1 (из начала)
queue.poll();  // 2

Deque (Double Ended Queue) — двусторонняя:

Deque<Integer> deque = new LinkedList<>();
deque.addFirst(1);   // Добавить в начало
deque.addLast(2);    // Добавить в конец
deque.pollFirst();   // Взять из начала
deque.pollLast();    // Взять из конца

Лучшие практики

  1. Используй offer()/poll() вместо add()/remove() для обработки ошибок
  2. Используй peek() если нужно только посмотреть без удаления
  3. Для многопоточности используй BlockingQueue
  4. LinkedList/ArrayDeque дешевле чем PriorityQueue
  5. PriorityQueue нарушает FIFO — используй если нужен порядок по приоритету
  6. Следи за переполнением — используй ограниченные очереди
Как называется интерфейс "первым вошел - первым вышел" | PrepBro