← Назад к вопросам
Как называется интерфейс "первым вошел - первым вышел"
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(); // Взять из конца
Лучшие практики
- Используй offer()/poll() вместо add()/remove() для обработки ошибок
- Используй peek() если нужно только посмотреть без удаления
- Для многопоточности используй BlockingQueue
- LinkedList/ArrayDeque дешевле чем PriorityQueue
- PriorityQueue нарушает FIFO — используй если нужен порядок по приоритету
- Следи за переполнением — используй ограниченные очереди