队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
以下实例演示了队列(Queue)的用法:
然后根据以上的api写一个demo:
public class QueueDemo {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
queue.offer("1");
queue.offer("2");
queue.offer("3");
queue.offer("4");
queue.offer("5");
//输出元素
System.out.println(queue);
System.out.println(queue.getClass());
//在这里我们可以看出,我们会去默认使用linkedList的方法
//但是如果一定要使用queue的方法,也会自动转型
//返回第一个元素,但是如果队列是空的会报错
System.out.println("第一个元素是" + queue.element());
//返回第一个元素,并且将这个元素删除
System.out.println("第一个元素是" + queue.poll()+",并且它已经被删除了");
//返回第一个元素,但是如果队列是空的会输出null
System.out.println("第一个元素变成了" + queue.peek());
}
}
但是,我们同时也要清楚,对于queue,最重要的还是先进先出,所以我们再写一个简单的先进先出的demo:
Queue<Integer> q = new LinkedList<>();
int i = 10;
while(i-->0){
q.offer(i);
if (q.size()>3){
((LinkedList<Integer>) q).removeFirst();
}
System.out.println(q);
}
/**
* [9]
* [9, 8]
* [9, 8, 7]
* [8, 7, 6]
* [7, 6, 5]
* [6, 5, 4]
* [5, 4, 3]
* [4, 3, 2]
* [3, 2, 1]
* [2, 1, 0]
*/
然后再介绍一个LinkedList很好用的过滤器API,removeIf,这个api呢,我通过一个lambda表达式,将包含3的都去除掉,也可以看输出来思考一下,这个过滤器的内部实现原理。
Queue<Integer> q = new LinkedList<>();
int i = 10;
while(i-->0){
q.offer(i);
q.removeIf(s -> q.contains(3));
if (q.size()>3){
((LinkedList<Integer>) q).removeFirst();
}
System.out.println(q);
}
/**
* [9]
* [9, 8]
* [9, 8, 7]
* [8, 7, 6]
* [7, 6, 5]
* [6, 5, 4]
* []
* [2]
* [2, 1]
* [2, 1, 0]
*/
而至于像java.util.concurrent包下的几个多线程下的几个Queue的使用方法,可以参考我写的这篇文章,毕竟队列阻塞的这个性质本身就适合使用在多线程环境下,所以还是有必要多学学的,包括更加高级的disruptor无锁多线程框架,也是参考的BlockingQueue去进行设计的,就可以看出其重要性了吧。
传送门:
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务