特点:先进先出
有界队列 ArrayBlockingQueue
无界队列 Queue<String> queuelinked = new LinkedList<String>();
底层为数组,入队方法:add() offer()
区别:超出有界队列的队列长度时再为添加元素,add()方法会抛出Queue full的异常,其实add()方法底层还是调用的offer()方法进行添加的
ArrayBlockingQueue queue = new ArrayBlockingQueue<String>(5);
queue.add("凌统");
queue.add("太史慈");
queue.add("太史慈");
queue.add("甘宁");
queue.add("周泰");
queue.add("孙策");
出队方法:peek() element() poll() remove()
peek()和element()方法会返回头元素,但不进行删除操作,区别依旧是队列为空时,前者返回null,后者抛出异常
poll()和remove()方法会返回头元素并将其在队列中删除,区别同上。
Queue<String> queuelinked = new LinkedList<String>();
queuelinked.add("凌统");
queuelinked.offer("太史慈");
queuelinked.offer("太史慈");
queuelinked.offer("甘宁");
queuelinked.offer("周泰");
System.out.println("peek:"+queuelinked.peek());
System.out.println(queuelinked);
优先队列 PriorityQueue
PriorityQueue 实现了 Queue 接口,不允许放入 null 元素;其通过堆实现,具体说是
通过完全二叉树(complete binary tree)实现的小顶堆(任意一个非叶子节点的权值,都不
大于其左右子节点的权值),也就意味着可以通过数组来作为PriorityQueue 的底层实现,
数组初始大小为11;也可以用一棵完全二叉树表示。优先队列的作用是能保证每次取出的元素都是队列中权值最小的(java)
public class test02 {
public static void main(String[] args) {
Queue<String> queue = new PriorityQueue<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// TODO Auto-generated method stub
Integer n1 = Integer.parseInt(o1.substring(3));
Integer n2 = Integer.parseInt(o2.substring(3));
if(o1.charAt(0)==o2.charAt(0)) {
return n1-n2;
}else {
return o1.charAt(0)-o2.charAt(0);
}
}
});
queue.offer("A刘备3");
queue.offer("A曹操1");
queue.offer("A孙权2");
queue.offer("B袁绍2");
queue.offer("B董卓1");
System.out.println(queue);
while(!queue.isEmpty()) {
System.out.println(queue.poll());
}
}
}
通过重写Comparator来设定比较规则,即设定优先队列的优先规则