在java5中新增加了java.util.Queue接口,用以支持队列的常见操作。
Queue接口与List、Set同一级别,都是继承了Collection接口。
Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。
新加的方法肯定有好处,不然干嘛加他,直接用add和remove方法不就好啦。add()和remove()方法在失败的时候会抛出异常。
如果要使用前端而不移出该元素,使用 element()或者peek()方法。
值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
LinkedList实现了Queue接口。
附上使用的示例代码,如下:
import java.util.LinkedList;
import java.util.Queue;
class Hello {
public static void main(String[] a) {
Queue<String> queue = new LinkedList<>();
queue.offer("1");//插入一个元素
queue.offer("2");
queue.offer("3");
//打印元素个数
System.out.println("queue.size() " + queue.size());//queue.size() 3
//遍历打印所有的元素,按照插入的顺序打印
for (String string : queue) {
System.out.println(string);
}
System.out.println("queue.size() " + queue.size());//queue.size() 3 上面只是简单循环,没改变队列
String getOneFrom1 = queue.element();
System.out.println("getOneFrom1 " + getOneFrom1);//getOneFrom1 1 因为使用前端而不移出该元素
System.out.println("queue.size() " + queue.size());//queue.size() 3 队列变啦才怪
String getOneFrom2 = queue.peek();
System.out.println("getOneFrom2 " + getOneFrom2);//getOneFrom2 1 因为使用前端而不移出该元素
System.out.println("queue.size() " + queue.size());//queue.size() 3 队列变啦才怪
String getOneFrom3 = queue.poll();
System.out.println("getOneFrom3 " + getOneFrom3);//getOneFrom3 1 获取并移出元素
System.out.println("queue.size() " + queue.size());//queue.size() 2 队列变啦
}
}
然后就是证明上面的结论是正确的,看看了队列这个接口的代码,如下:真不多。一共就六个方法。
//摘自Java 1.8 源码,注释摘一半不到.这个接口,就这么几个方法,好幸福啊,这么少。
public interface Queue<E> extends Collection<E> {
/**
* Inserts the specified element into this queue if it is possible to do so
* immediately without violating capacity restrictions, returning
* {@code true} upon success and throwing an {@code IllegalStateException}
* if no space is currently available.
* ......
*/
boolean add(E e);//比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.
* ......
*/
boolean offer(E e);
/**
* Retrieves and removes the head of this queue. This method differs
* from {@link #poll poll} only in that it throws an exception if this
* queue is empty.
* ......
*/
E remove();//与poll的差别是当队列是空的时候,这个要报异常,下面返回null
/**
* Retrieves and removes the head of this queue,
* or returns {@code null} if this queue is empty.
* ....
*/
E poll();
/**
* Retrieves, but does not remove, the head of this queue. This method
* differs from {@link #peek peek} only in that it throws an exception
* if this queue is empty.
* ......
*/
E element();//当队列空的时候异常,下面的只是返回null
/**
* Retrieves, but does not remove, the head of this queue,
* or returns {@code null} if this queue is empty.
* ......
*/
E peek();
}