当前位置:网站首页 > 技术博客 > 正文

java队列queue实现



廖雪峰
资深软件开发工程师,业余马拉松选手。

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

  • 把元素添加到队列末尾;
  • 从队列头部取出元素。

超市的收银台就是一个队列:

queue

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

  • :获取队列长度;
  • /:添加元素到队尾;
  • /:获取队首元素并从队列中删除;
  • /:获取队首元素但并不从队列中删除。

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

throw Exception 返回false或null 添加元素到队尾 add(E e) boolean offer(E e) 取队首元素并删除 E remove() E poll() 取队首元素但不删除 E element() E peek()

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

 

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

 

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

 

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

 

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

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

接下来我们以和为例来说说“获取并删除”与“获取但不删除”的区别。对于来说,每次调用,都会获取队首元素,并且获取到的元素已经从队列中被删除了:

 

如果用,因为获取队首元素时,并不会从队列中删除这个元素,所以可以反复获取:

 

从上面的代码中,我们还可以发现,即实现了接口,又实现了接口,但是,在使用的时候,如果我们把它当作List,就获取List的引用,如果我们把它当作Queue,就获取Queue的引用:

 

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

小结

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

  • 通过/方法将元素添加到队尾;
  • 通过/从队首获取元素并删除;
  • 通过/从队首获取元素但不删除。

版权声明


相关文章:

  • java笔试题(java经典笔试题大全(50道含答案))2024-10-27 19:01:00
  • 初中生学java好学吗2024-10-27 19:01:00
  • java输入语句scanner输入数组2024-10-27 19:01:00
  • java heap space 解决方法jar包2024-10-27 19:01:00
  • java定时器的使用2024-10-27 19:01:00
  • C语言static关键字新用法2024-10-27 19:01:00
  • java反射详解2024-10-27 19:01:00
  • java安装(\xA0 \u524D\u8A00Java/JDK\u4E0B\u8F7D\u3001\u5B89\u88C5\u4E0E\u73AF\u5883\u914D\u7F6E\u8D85\u8BE6\u7EC6\u6559\u7A0B\uFF082022\u66F4\u65B0\uFF09\u4FDD\u59C6\u7EA7\uFF0C\u5C0F\u767D\u792024-10-27 19:01:00
  • java基础面试题(Java面试题及答案整理( 2024年 6 月最新版,持续更新))2024-10-27 19:01:00
  • java随机数(Java中生成随机数的4种方式!)2024-10-27 19:01:00