Каково различие между добавлением и методами предложения в Очереди в Java?

Возьмите PriorityQueue например, http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer (E)

Может любой давать мне пример a Queue где add и offer методы отличаются?

Согласно Collection документ, add метод будет часто стремиться гарантировать, что элемент существует в Collection вместо того, чтобы добавлять дубликаты. Таким образом, мой вопрос, каково различие между add и offer методы?

Случается так что offer метод добавит дубликаты независимо? (Я сомневаюсь, что это потому что если a Collection должен только иметь отличные элементы, это обошло бы это).

Править: В a PriorityQueue add и offer методы являются тем же методом (см. мой ответ ниже). Может любой давать мне пример класса где add и offer методы отличаются?

100
задан Nikhil Arora 13 December 2016 в 05:37
поделиться

3 ответа

Думаю, разница в контракте: когда элемент не может быть добавлен в коллекцию, метод add выдает исключение, а метод offer - нет.

От: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collection.html#add%28E%29

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

От: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Queue.html#offer%28E%29

Вставляет указанный элемент в { {1}} в эту очередь, если возможно. При использовании очередей , которые могут налагать ограничения на вставку (например, границы емкости ), предложение метода обычно предпочтительнее метода Collection.add (E), который может не вставить элемент, только вызвав исключение .

138
ответ дан 24 November 2019 в 04:51
поделиться

Нет никакой разницы для реализации PriorityQueue.add :

public boolean add(E e) {
    return offer(e);
}

Для AbstractQueue на самом деле разница есть:

public boolean add(E e) {
    if (offer(e))
        return true;
    else
        throw new IllegalStateException("Queue full");
}
25
ответ дан 24 November 2019 в 04:51
поделиться

Разница между предложение и add объясняется этими двумя выдержками из javadocs:

Из интерфейса Collection :

Если коллекция отказывается добавить ] конкретный элемент по любой причине, кроме того, что он уже содержит элемент, он должен вызывать исключение (а не возвращать false). Это сохраняет инвариант, что коллекция всегда содержит указанный элемент после возврата из этого вызова.

Из интерфейса Queue

При использовании очередей, которые могут налагать ограничения на вставку (например, границы емкости), метод offer обычно предпочтительнее метода Collection.add (E) , который может не вставить элемент, только вызвав исключение.

PriorityQueue - это реализация Queue , которая не налагает никаких ограничений на вставку. Поэтому методы add и offer имеют одинаковую семантику.

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

12
ответ дан 24 November 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: