1.简述

  Queue用于模拟队列这种数据结构,队列通常是指先进先出(FIFO)的容器。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。

  Queue接口中有以下几个常用实现类

  • PriorityQueue:非阻塞、非线程安全、无边界,支持优先级队列实现类。
  • ConcurrentLinkedQueue:非阻塞、线程安全、无边界,基于链接节点的队列实现类。
  • ArrayBlockingQueue:阻塞、线程安全、有边界,一旦创建容量不可改变实现类。
  • LinkedBlockingQueue:阻塞、线程安全、可选有边界,一个由链表结构组成的可选有界阻塞队列实现类,如果未指定容量,那么容量将等于Integer.MAX_VALUE
  • PriorityBlockingQueue:阻塞、线程安全、无边界,支持优先级排序的无边界阻塞队列实现类。
  • DelayQueue:阻塞、线程安全、无边界,使用优先级队列实现的无界阻塞队列实现类,只有在延迟期满时才能从中提取元素。
  • SynchronousQueue:阻塞、线程安全、无数据队列,不存储元素、没有内部容量的阻塞队列实现类。
  • LinkedBlockingDeque:阻塞、线程安全、无边界,由链表结构组成的可选范围双向阻塞队列实现类,如果未指定容量,那么容量将等于 Integer.MAX_VALUE

2.PriorityQueue

  PriorityQueue即优先队列,优先队列的作用是能保证每次取出的元素都是队列中权值最小的(优先队列每次取最小元素)。这里牵涉到了大小关系,元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Comparator)。

  PriorityQueue不允许放入null元素。其通过堆实现,具体说是通过完全二叉树(complete binary tree)实现的小顶堆(任意一个非叶子节点的权值,都不大于其左右子节点的权值),也就意味着可以通过数组来作为PriorityQueue的底层实现。

  定义一个PriorityQueue的方式有如下几种

//创建一个PriorityQueue队列,初始化一个容量为11的且以自然顺序排序元素的优先队列
PriorityQueue<String> queue = new PriorityQueue<String>(); 
//创建一个PriorityQueue队列,初始化指定大小的容量的优先队列,且以自然顺序排列元素
queue = new PriorityQueue<String>(30);
//创建一个PriorityQueue队列,包含collection
queue = new PriorityQueue<String>(new ArrayList<String>());
//创建一个PriorityQueue队列,初始化指定大小(不能少于1)和比较器的优先队列
queue = new PriorityQueue<String>(30, new Comparator<String>(){
    @Override
    public int compare(String o1, String o2) {
        return o1.compareTo(o2);
    }
});
View Code

相关文章: