ArrayDqueue Class的add(E e)和offer(E e)之间的差异

Jok*_*ker 5 java deque arraydeque

嗨,我使用添加和提供添加我的元素在最后的步伐.两者都返回布尔值,两者都不会抛出除NPE之外的任何异常.

 public class ArrayDequeDemo {

  public static void main(String[] args) {


    // Create ArrayDeque elements.
    ArrayDeque<Integer> deque = new ArrayDeque<>();
    deque.add(10);
    deque.offer(30);

   }
 }
Run Code Online (Sandbox Code Playgroud)

两者都会通过返回布尔值在最后的位置添加元素.

JAVA实施

//For Add and Offer Both
   public void addLast(E e) {
    if (e == null)
        throw new NullPointerException();
    elements[tail] = e;
    if ( (tail = (tail + 1) & (elements.length - 1)) == head)
        doubleCapacity();
}
Run Code Online (Sandbox Code Playgroud)

rua*_*akh 10

这两种方法是等价的.

它们都存在的原因是,java.util.Queue接口同时指定.

java.util.Queue指定两者的原因java.util.Queue是允许实现允许实现容量限制,并且指定两个方法在添加元素将违反该限制的情况下表现不同; 具体而言,add(...)指定抛出IllegalStateException那种情况,而offer(...)只是返回false.

java.util.ArrayDeque但是,没有实施任何容量限制,因此不会出现这种情况,因此区别不适用.

  • @ShowStopper:正如我在此答案中所写,这两种方法是等效的。没有区别。 (2认同)

Mak*_*oto 5

Queue文档在解释差异方面做得相当好。

  • add(E e)如果无法将元素添加到队列中,则具有抛出异常的能力。如果队列已满,就会发生这种情况。

  • offer(E e)如果无法将值添加到队列中,则将返回一个特殊值(在本例中为布尔值)。如果您正在处理大小受限的队列但不想抛出异常,这将非常有用。

  • 我正在解释实际接口而不是底层实现。这是一种*公平*的立场,因为人们可以轻松地将界面换成其他东西。由于这两种方法都是[指定的](http://docs.oracle.com/javase/7/docs/api/java/util/ArrayDeque.html#add(E)) [接口](http://docs .oracle.com/javase/7/docs/api/java/util/ArrayDeque.html#offer(E)),提到接口没有任何不妥。我很清楚 `ArrayDeque` 不会抛出异常,但它**是**由该接口指定的。 (2认同)