8

嗨,我使用 add 和 offer 在最后一步添加我的元素。两者都返回布尔值,并且除了 NPE 之外都不会抛出任何异常。

 public class ArrayDequeDemo {

  public static void main(String[] args) {


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

   }
 }

两者都将通过返回一个布尔值将元素添加到最后一个位置。

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();
}
4

4 回答 4

14

这两种方法是等价的。

它们都存在的原因是接口java.util.Queue指定了两者。

java.util.Queue指定两者的原因java.util.Queue是允许实现 的实现来实现容量限制,并且在添加元素会违反该限制的情况下,指定这两种方法的行为不同;具体来说,add(...)指定IllegalStateException在这种情况下抛出,而offer(...)简单地返回false

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

于 2015-03-17T06:03:09.890 回答
5

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

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

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

于 2015-03-17T05:53:23.767 回答
2

在 Java SE 8 中

  • boolean add(E e)

    如果可以在不违反容量限制的情况下立即将指定元素插入此双端队列表示的队列中(换句话说,在此双端队列的尾部),则在成功时返回 true 并抛出 IllegalStateException如果当前没有可用空间。
    当使用容量受限的双端队列时,通常最好使用 offer(E e)。

    在此双端队列的末尾插入指定的元素。
    此方法等效于 addLast(E)。

  • boolean offer(E e)

    如果可以在不违反容量限制的情况下立即将指定元素插入此 deque 表示的队列中(换句话说,在此 deque 的尾部),则在成功时返回 true,否则返回 false当前可用空间。
    当使用容量受限的双端队列时,此方法通常优于add(E)方法,后者仅通过抛出异常可能无法插入元素。

    在此双端队列的末尾插入指定的元素。
    此方法等效于 offerLast(E)。

于 2017-06-16T10:25:26.343 回答
1

offer(E e)如果当前没有可用空间,则方法不会抛出IllegalStateException,如果没有可用空间,则返回 false

但是如果当前没有可用空间,add(E e)方法将抛出。IllegalStateException

和其他事情是一样的。

于 2015-03-17T05:53:28.367 回答