经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
5.6(java学习笔记) queue
来源:cnblogs  作者:gcmh  时间:2018/10/17 9:10:14  对本文有异议

一.queue接口

queue的中文意思是队列,是一种以先进先出方式处理数据的集合。

 

队列还提供额外的插入、提取和检查操作。这些方法都以两种形式存在:一种在操作失败时抛出异常,另一种返回特殊值(根据操作,为空或为假)。

后一种形式的插入操作是专门针对容量受限的队列实现设计的

 

有些方法以两种形式存在,只是操作失败时处理的方式不同,一个是抛出异常,一个是返回特殊值(false或null)。

这个根据自己需要进行选择。

 

实现这个接口的类有:

 

下面说两个常用方法。

1.boolean offer(E e)

向队列中插入元素,如果操作成功返回true,反之返回false。

 

2.E poll()

检索并移除队列的头部,返回移除的队列头部元素,如果头部为空则返回null。

 

我们来举个例子:

  1. import java.util.ArrayDeque;
  2. import java.util.Queue;
  3. public class Demo01 {
  4. public static void main(String[] args) {
  5. Queue<Request> que = new ArrayDeque<Request>();//ArrayDeque是支持容量扩展的。
  6. for(int i = 0; i < 10; i++){
  7. final int num = i;
  8. que.offer(new Request(){//在队列中放入10个元素,此处使用匿名内部类
  9. @Override
  10. public void deposit() {
  11. // TODO Auto-generated method stub
  12. System.out.println("第"+num+"个人存款:" + Math.random()*10000);//生产随机出模拟存款
  13. }
  14. });
  15. }
  16. dealWith(que);//输出队列。
  17. System.out.println("--------");
  18. dealWith(que);
  19. }
  20. public static void dealWith(Queue<Request> que){//输出队列的方法
  21. Request req = null;
  22. while((req = que.poll()) != null){
  23. req.deposit();
  24. }
  25. }
  26. }
  27. interface Request{//定义的一个接口
  28. void deposit();
  29. }
  1. 运行结果:
  2. 0个人存款:8619.233801715016
  3. 1个人存款:5111.3672776256135
  4. 2个人存款:3833.7846958074883
  5. 3个人存款:534.977625279095
  6. 4个人存款:40.69671570731348
  7. 5个人存款:986.8179704462143
  8. 6个人存款:5995.7651112520325
  9. 7个人存款:8142.90423161368
  10. 8个人存款:5153.935940310687
  11. 9个人存款:4599.385486329686
  12. --------

可以看到,poll是移除队列头部并返回,所以输出完后无法再次输出队列。

 

其实添加元素就是不停在队列尾部添加,移除时不停将头部置为null并将头部后移。

我们来看下源码:

用于存放数据的是一个object类型的数组。

初始长度为16,容量不足可自动扩容。

 

offer(E e)

offer()最后调用的是addLast,tail是尾部的索引,我们可以看到将元素添加到尾部后,

尾部索引后移一位。

 

我们接着来看下poll();

移除元素就将头部元素给result,然后判断下如果头部为空则返回null.

后面将头部置null,然后返回头部元素,头部索引后移一位。

 

我们可以发现在队列中有向头部添加元素的方法,也有像尾部添加元素的方法。

这些结合下,我们能否用队列实现堆栈的功能?

 

堆栈是先进后出,我们也看了上列代码中添加时是在尾部添加,最后获取时是在头部获取才造成了先进先出的现象。

假如我们不断在尾部添加,添加完后再不断从尾部获取这样是不是就是实现了后进先出。

还是上列代码,我们只需要修改一个地方就可以了,将从头部开始移除并返回移除元素,改成从尾部开始移除,并返回尾部元素即可。

 

  1. import java.util.ArrayDeque;
  2. import java.util.Queue;
  3. public class Demo01 {
  4. public static void main(String[] args) {
  5. Queue<Request> que = new ArrayDeque<Request>();for(int i = 0; i < 10; i++){
  6. final int num = i;
  7. que.offer(new Request(){
  8. @Override
  9. public void deposit() {
  10. // TODO Auto-generated method stub
  11. System.out.println("第"+num+"个人存款:" + Math.random()*10000);
  12. }
  13. });
  14. }
  15. dealWith(que);
  16. System.out.println("--------" + o.length);
  17. dealWith(que);
  18. }
  19. public static void dealWith(Queue<Request> que){
  20. Request req = null;
  21. while((req = ((ArrayDeque<Request>) que).pollLast()) != null){//将poll中原先调用pollFirst改为pollLast.
  22. req.deposit();
  23. }
  24. }
  25. }
  26. interface Request{
  27. void deposit();
  28. }
  1. 运行结果:
    9个人存款:4418.752779875663
  2. 8个人存款:894.3762449014581
  3. 7个人存款:6559.006752015596
  4. 6个人存款:2725.551000497387
  5. 5个人存款:1180.896859117061
  6. 4个人存款:7267.814454629828
  7. 3个人存款:9021.26681251365
  8. 2个人存款:5066.769610999404
  9. 1个人存款:6173.24968987338
  10. 0个人存款:6288.854161224456
  11. --------
    //从后向前移除就是将尾部元素返回,并且将尾部前移一位。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号