Почему Java предоставляет два метода для удаления элемента из очереди? - PullRequest
26 голосов
/ 03 февраля 2010

Реализация Queue в Java имеет два метода для удаления элемента: один - remove(), который вызывает исключение, а другой - poll(), который возвращает null для пустой очереди. У меня есть два сомнения:

  1. Почему Queue имеет другую реализацию для удаления элемента?
  2. Какую реализацию использовать, когда?

Ответы [ 7 ]

23 голосов
/ 03 февраля 2010

В некоторых ситуациях ожидается, что очередь будет пустой, и в этих случаях целесообразно иметь метод, который не генерирует исключение. В других ситуациях исключительным обстоятельством является то, что очередь пуста, и для нее подходит исключение.

Создание исключений влечет за собой снижение производительности, и если вы ожидаете, что очередь будет время от времени пустой, вам не нужно обрабатывать queue-empty-logic как перехват исключения - это одновременно дорогой и трудный для чтения.

В противоположном случае, когда вы не ожидаете, что очередь будет пустой, это признак ошибки программирования или какого-то другого исключительного обстоятельства, и вы не хотите писать ужасный код проверки состояния ошибки. (например, проверка на ноль), потому что в этом случае это будет менее читабельным, чем перехват исключения (что можно сделать в другой области).

14 голосов
/ 03 февраля 2010

Абстрактный класс AbstractQueue<E> реализует Queue<E> и определяет метод удаления.

Вы можете взглянуть на исходный код:

public E remove() {
    E x = poll();
    if (x != null)
        return x;
    else
        throw new NoSuchElementException();
}

Итак, как вы можете видеть,remove() метод использовать poll() метод.

Вы можете использовать тот, который вы предпочитаете.

5 голосов
/ 21 декабря 2012

Глядя на ответы, мне было непонятно, что именно, поэтому:

Прямо из API: Методы remove () и poll () отличаются толькоих поведение, когда очередь пуста: метод remove () выдает исключение, а метод poll () возвращает нуль

4 голосов
/ 03 февраля 2010

Если вы знаете, как реагировать прямо сейчас и / или ожидаете, что элементы отсутствуют, используйте опрос.

В противном случае используйте удалить.

2 голосов
/ 27 сентября 2016

Remove() метод отличается от опроса только тем, что выдает исключение, если эта очередь пуста.

enter image description here

1 голос
/ 03 февраля 2010

Иногда требуется, чтобы для пустой очереди возвращалось пустое значение, а иногда требуется, чтобы оно рассматривало пустую очередь как исключительную ситуацию.

0 голосов
/ 03 февраля 2010

Два метода используются по-разному в классических дискуссиях о структуре очереди. Я использую poll () в основном для извлечения элементов и удаления () в основном, если мне нужно изменить очередь вне обычного цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...