Возьмите 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
методы отличаются?
Думаю, разница в контракте: когда элемент не может быть добавлен в коллекцию, метод 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), который может не вставить элемент, только вызвав исключение .
Нет никакой разницы для реализации 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");
}
Разница между предложение
и add
объясняется этими двумя выдержками из javadocs:
Из интерфейса Collection
:
Если коллекция отказывается
добавить
] конкретный элемент по любой причине, кроме того, что он уже содержит элемент, он должен вызывать исключение (а не возвращать false). Это сохраняет инвариант, что коллекция всегда содержит указанный элемент после возврата из этого вызова.
Из интерфейса Queue
При использовании очередей, которые могут налагать ограничения на вставку (например, границы емкости), метод
offer
обычно предпочтительнее методаCollection.add (E)
, который может не вставить элемент, только вызвав исключение.
PriorityQueue
- это реализация Queue
, которая не налагает никаких ограничений на вставку. Поэтому методы add
и offer
имеют одинаковую семантику.
Напротив, ArrayBlockingQueue
представляет собой реализацию, в которой предлагают
и добавляют
по-разному, в зависимости от того, как была создана очередь.