Queue接口的add()和offer()方法之间的区别

时间:2013-12-11 18:16:25

标签: java queue fifo

我在Java中使用FIFO实现并遇到了这个java.util.Queue接口。 Dequeue实现它,而后者又由Linked List实现。

我写了以下代码

public class FIFOTest {

    public static void main(String args[]){

        Queue<String> myQueue = new LinkedList<String>();
        myQueue.add("US");
        myQueue.offer("Canada");

        for(String element : myQueue){
            System.out.println("Element : " + element);
        }
    }

}

两者似乎都做同样的事情。将数据添加到队列的头部。这两种方法有什么区别?任何特殊情况都要比其他情况更有益?

4 个答案:

答案 0 :(得分:7)

LinkedList#offer(E)实现为

public boolean offer(E e) {
    return add(e);
}

在这种情况下,它们是相同的。他们只需要满足接口。 LinkedList实施DequeListLinkedList#add(E)方法不会抛出Exception,因为它总是需要更多元素,但在另一个Queue实施中,其容量有限或仅采用某些类型的元素,add(E)可能会抛出异常而offer(E)只会返回false

答案 1 :(得分:3)

  

这两种方法有什么区别?

  • Queue.add - 如果操作失败则抛出异常,
  • Queue.offer - 返回一个特殊值(nullfalse,具体取决于操作)。
  

任何特殊情况下哪一种比其他情况更有益?

根据文档,插入操作的 Queue.offer 形式专门为 使用容量限制的队列实现;多数情况 实现,插入操作不会失败。

有关详细信息,请阅读此docs

答案 2 :(得分:2)

根据the docs,主要区别在于当操作失败时,一个(add)抛出异常而另一个(offer)返回一个特殊值({{1} }):

  

这些方法中的每一种都以两种形式存在:一种在操作失败时抛出异常,另一种返回特殊值(null或false,具体取决于操作)。后一种形式的插入操作专门用于容量限制的队列实现;在大多数实现中,插入操作不会失败。

答案 3 :(得分:1)

  • add()来自Collection界面。
  • offer()来自Queue界面。

Queue offer()方法的文档说

  Inserts the specified element into this queue if it is possible to do
  so immediately without violating capacity restrictions.
  When using a capacity-restricted queue, this method is generally
  preferable to {@link #add}, which can fail to insert an element only
  by throwing an exception.

Queue add()方法的文档说

 Inserts the specified element into this queue if it is possible to do so
 immediately without violating capacity restrictions, returning
 <tt>true</tt> upon success and throwing an <tt>IllegalStateException</tt>
 if no space is currently available.