前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >集合框架【第三章】——queue队列

集合框架【第三章】——queue队列

作者头像
用户10196776
发布2022-11-22 14:20:23
2920
发布2022-11-22 14:20:23
举报
文章被收录于专栏:SpringBoot+MyBatis前端

队列(Queue)是一种经常使用的集合。Queue实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。它和List的区别在于,List可以在任意位置添加和删除元素,而Queue只有两个操作:

把元素添加到队列末尾; 从队列头部取出元素。 一个简单的队列Queue如图所示:

在Java的标准库中,队列接口Queue定义了以下几个方法:

int size():获取队列长度; boolean add(E)/boolean offer(E):添加元素到队尾; E remove()/E poll():获取队首元素并从队列中删除; E element()/E peek():获取队首元素但并不从队列中删除。

 对于具体的实现类,有的Queue有最大队列长度限制,有的Queue没有。注意到添加、删除和获取队列元素总是有两个方法,这是因为在添加或获取元素失败时,这两个方法的行为是不同的。(这是Queue的一些异常处理表格如下:)

throwException    返回false或null 添加元素到队尾    add(Ee)    booleanoffer(Ee) 取队首元素并删除    Eremove()    Epoll() 取队首元素但不删除    Eelement()    Epeek()

举个例子,假设我们有一个队列,对它做一个添加操作,如果调用add()方法,当添加失败时(可能超过了队列的容量),它会抛出异常: 

代码语言:javascript
复制
Queue<String> q =new LinkedList<String>();
        try {
         q.add("今天是个好日子");
         System.out.println("添加成功");
        q.forEach(System.out::println);
        } catch(IllegalStateException e) {
         System.out.println("添加失败");
        }

如果我们调用offer()方法来添加元素,当添加失败时,它不会抛异常,而是返回false:

代码语言:javascript
复制
Queue<String> q = new LinkedList<String>();
if (q.offer("今天是个好日子")) {
    System.out.println("添加成功");
} else {
    System.out.println("添加失败");
}

当我们需要从Queue中取出队首元素时,如果当前Queue是一个空队列,调用remove()方法,它会抛出异常:

代码语言:javascript
复制
​
Queue<String> q ="小秘密"(细节一点哦!我不介意来问我)
try {
    String s = q.remove();
    System.out.println("获取成功");
} catch(IllegalStateException e) {
    System.out.println("获取失败");
}

​

如果我们调用poll()方法来取出队首元素,当获取失败时,它不会抛异常,而是返回null:

代码语言:javascript
复制
​
Queue<String> q =  "小秘密"(细节一点哦!我不介意来问我)
String h = q.poll();
if (h!= null) {
    System.out.println("获取成功");
} else {
    System.out.println("获取失败");
}

​

因此,两套方法可以根据需要来选择使用。

注意:不要把null添加到队列中,否则poll()方法返回null时,很难确定是取到了null元素还是队列为空。

接下来我们以poll()和peek()为例来说说“获取并删除”与“获取但不删除”的区别。对于Queue来说,每次调用poll(),都会获取队首元素,并且获取到的元素已经从队列中被删除了:  如果用peek(),因为获取队首元素时,并不会从队列中删除这个元素,所以可以反复获取: 从上面的代码中,我们还可以发现,LinkedList即实现了List接口,又实现了Queue接口,但是,在使用的时候,如果我们把它当作List,就获取List的引用,如果我们把它当作Queue,就获取Queue的引用:

// 这是一个List:

List<String> list = new LinkedList<>(); // 这是一个Queue:

Queue<String> queue = new LinkedList<>();

始终按照面向抽象编程的原则编写代码,可以大大提高代码的质量。

小结一下下: 队列Queue实现了一个先进先出(FIFO)的数据结构:

通过add()/offer()方法将元素添加到队尾; 通过remove()/poll()从队首获取元素并删除; 通过element()/peek()从队首获取元素但不删除。 要避免把null添加到队列。

另外祝各位小伙伴们六一快乐!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 队列(Queue)是一种经常使用的集合。Queue实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。它和List的区别在于,List可以在任意位置添加和删除元素,而Queue只有两个操作:
  • // 这是一个List:
  • 小结一下下: 队列Queue实现了一个先进先出(FIFO)的数据结构:
  • 通过add()/offer()方法将元素添加到队尾; 通过remove()/poll()从队首获取元素并删除; 通过element()/peek()从队首获取元素但不删除。 要避免把null添加到队列。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档