Возьмем, PriorityQueue
например, http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)
Может кто - нибудь дать мне пример , Queue
где add
и offer
методы различны?
Согласно Collection
документу, add
метод часто стремится обеспечить наличие элемента внутри, Collection
а не добавлять дубликаты. Так что мой вопрос, в чем разница между add
и offer
методами?
Неужели offer
метод все равно добавит дубликаты? (Я сомневаюсь, что это потому, что если бы у a Collection
были только отдельные элементы, это бы обошло это).
РЕДАКТИРОВАТЬ: PriorityQueue
в методах add
и offer
используется один и тот же метод (см. Мой ответ ниже). Может кто - нибудь дать мне пример класса , где add
и offer
методы различны?
offer
противadd
.Нет разницы по реализации
PriorityQueue.add
:На
AbstractQueue
самом деле разница есть:источник
add
метод отличается отoffer
метода?Разница между
offer
иadd
объясняется этими двумя отрывками из документации javadoc:Из
Collection
интерфейса:Из
Queue
интерфейсаPriorityQueue
этоQueue
реализация, которая не накладывает никаких ограничений на вставку. Поэтомуadd
иoffer
методы имеют ту же семантику.Напротив,
ArrayBlockingQueue
это реализация, в которойoffer
иadd
ведут себя по-разному, в зависимости от того, как была создана очередь.источник
Разница следующая:
метод предложения - пытается добавить элемент в очередь и возвращает false, если элемент не может быть добавлен (например, в случае, когда очередь заполнена), или true, если элемент был добавлен, и не вызывает какого-либо конкретного исключения .
add method - пытается добавить элемент в очередь, возвращает true, если элемент был добавлен, или выдает исключение IllegalStateException, если в данный момент нет свободного места.
источник
из исходного кода в jdk 7 следующим образом:
мы можем легко узнать, что функция добавления вернет true при успешном добавлении нового элемента в очередь, но выдаст исключение при неудаче.
источник
В
Queue
интерфейсе определяет , чтоadd()
будет сгенерирован ,IllegalStateException
если нет места в настоящее время доступно (и в противном случае возвратtrue
) , аoffer()
вернется ,false
если элемент не может быть введен из - за ограничения пропускной способности.Причина, по которой они одинаковы в a,
PriorityQueue
заключается в том, что эта очередь указана как неограниченная, т. Е. Нет ограничений по емкости. В случае отсутствия ограничений мощности контрактыadd()
иoffer()
демонстрируют одинаковое поведение.источник
Я напишу пример кода java-контракта для метода предложения и добавлю метод, показывающий, чем они отличаются.
источник
Источник: http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html
Метод предложения вставляет элемент, если это возможно, иначе возвращает false. Это отличается от метода Collection.add, который может не добавить элемент, только вызвав непроверенное исключение. Метод предложения разработан для использования, когда сбой является нормальным, а не исключительным случаем, например, в очередях с фиксированной емкостью (или «ограниченной»).
источник