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); } });