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

时间:2015-03-17 05:41:51

标签: 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);

   }
 }

两者都会通过返回布尔值来添加元素。

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 个答案:

答案 0 :(得分:8)

这两种方法是等效的。

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

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

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

答案 1 :(得分:1)

Queue documentation在解释差异方面做得相当不错。

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

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

答案 2 :(得分:0)

如果当前没有可用空间,

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

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

和其他事情是一样的。

答案 3 :(得分:0)

In Java SE 8

  • boolean add(E e)

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

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

  • 布尔报价(E e)

    如果可以在不违反容量限制的情况下立即执行此操作,则将指定的元素插入此双端队列表示的队列(换句话说,在此双端队列的尾部),成功时返回true,如果当前没有可用空间则返回false。 br />使用容量限制的双端队列时,此方法通常优于add(E)方法,只能通过抛出异常来插入元素。

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