队列的特点是先进先出

  单项队列只能在队尾添加元素,从队头删除元素。

  双向队列的队头和队尾都支持元素的入队和出队。

public interface Deque<E> extends Queue<E>{
  void addFirst(E e);
  void addLast(E e);

  E removeFirst();
  E removeLast();
}

  一般情况下,Queue的实现类不允许添加null元素。因为poll(),peek()方法在异常时会返回null

public interface Queue<E> extends Collection<E>{
  boolean add(E e);  //Exception
  boolean offer(E e); // return special value
  E remove();//Exception
  E poll();// return special value
  E element();//Exception
  E peek();// return special value
}

 

PriorityQueue  

  PriorityQueue又叫做优先级队列,保存队列元素的顺序不是按照加入队列的顺序,而是按照队列元素的大小进行排序的。不允许null元素。PriorityQueue使用了堆数据结构。底层使用数组保存数据。PriorityQueue元素可以使用默认的自然排序或提供Comparator在队列实例化时指定的排序方式进行排序。当PriorityQueue中没有指定Comparator时,加入的元素必须事先了Comparable接口,否则会导致ClassCastException。

   PriorityQueue调用默认的构造方法时,使用默认的初识容量(DEFAULT_IITIAL_CAPACITY = 11)创建一个PriorityQueue,并根据其自然顺序来排序元素

  PriorityQueue不是线程安全的。PriorityBlockingQueue是线程安全的

  不允许插入null元素

  PriorityQueue实现插入方法(offer,poll,remove()和add方法)的时间复杂度是O(log(n)),实现remove(Object)和contains(Object)方法的时间复杂度是O(n),实现检索方法(peek,element和size)的时间复杂度是O(1),在不需要删除元素时,应使用peek的方式遍历每个元素。

  iterator()职工提供的迭代器并不保证以有序的方式遍历PriorityQueue中的元素

 

ArrayDeque

  ArrayDeque使用数组实现的Deque,底层是数组,默认长度是16。思路是引入两个游标,head和tail,若向队列里插入一个元素,就把tail向后移动。若从队列中删除一个元素,就把head向后移动。若tail已经指向了数组的最后一位,则把head重新指向数组的头就可以了。即用一个环形数组来实现队列。ArrayDeque也是县城不安全的。

 

  ArrayBlockingQueue在构造时需要指定容量,并可以选择是否需要公平性,若公平参数被设置为true,等待时间最长的线程会优先得到处理。

  DelayQueue是一个存放Delayed元素的无阻塞队列,只有延迟期满时才能从国内中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed元素。若延迟起都没有满,则队列没有头部,并且poll方法返回null。当一个元素的getDelay()方法返回一个小于或等于零的值,则出现期满,poll就可以一出这个元素了。此队列不允许使用null元素。放入DelayQueue的元素还要实现compareTo方法,DelayQueue使用这个来为元素排序。