JavaSE基础知识(二十一)--Java集合(容器)之接口Queue的源码分析

Java SE 是什么,包括哪些内容(二十一)?

本文内容参考自Java8标准
队列的根接口:

Queue

CollectionQueue
size()
isempty()
contains(Object o)
iterator()
toArray()
toArray(T[] a)
add(E e)add(E e)
offer(E e)
remove(Object o) 删除指定元素
remove() 删除端(头部)元素
poll()
containsAll(Collection<?> c)
addAll(Collection<? extends E> c)
removeAll(Collection<?> c)
removeIf(Predicate<? super E> filter)
retainAll(Collection<?> c)
clear()
equals(Object o)
hashCode()
spliterator()
stream()
parallelStream()
element()
peek()

接口声明:

   public interface Queue<E> extends Collection<E>{ }

源代码图示(图下面有解释说明):
接口Queue源码文档解释
英文注释分别阐述了以下内容(一个段落用一个小标):
⑴、Queue具有如下特点:
①、只能在Queue的端(头部)访问、操作元素(不能随机访问、操作)。
②、Queue体现了优先处理的概念(priority):先经过端(头部)的元素优先处理。
③、除集合根接口Collection提供的添加、删除、返回操作之外,Queue还提供了额外的添加、删除、返回操作(参考以下表格),这些操作均以两种形式存在:一种在操作失败时抛出异常,另一种返回特殊值(方法offer(E e)专门用于容量受限的Queue,大多数实现的添加操作不会失败) 。

添加备注
add(E e);添加成功返回true,添加失败抛出IllegalStateException异常
offer(E e);添加成功返回true,添加失败返回false
删除备注
remove();删除成功返回元素,Queue为null抛出NoSuchElementException异常
poll();删除成功返回元素,Queue为null返回null
返回备注
element();Queue为null抛出NoSuchElementException异常
peek();Queue为null返回null

⑵、Queue有两种策略:
①、FIFO(先进先出,添加元素在一端(尾部),删除、返回元素在另一端(头部))
②、LIFO(后进先出,添加、删除、返回元素在同一端(头部))
Queue通常会按照以上两种策略对元素排序,但没有强制要求。除非是优先队列(PriorityQueue),优先队列强制要求一定要对它的所有元素排序(根据比较器或元素的自然顺序)。不论使用了哪种排序方式,方法remove()和方法poll()删除的都是Queue的端(头部)元素,每一种Queue的实现都必须提供它的排序规则。
⑶、方法offer(E e)添加元素成功返回true,否则返回false,它与接口Collection的方法add(E e)不同(添加元素失败抛出异常),固定容量的Queue添加元素使用add(E e),其它情况使用offer(E e)。
⑷、方法remove()和poll()删除并返回Queue的端(头部)元素,具体删除的元素由Queue的排序策略决定(每种Queue的排序策略都可能不同),当Queue为空时,方法remove()抛出异常而方法poll()返回null。
⑸、方法element()和方法peek()仅仅返回Queue的端(头部)元素而不会进行删除。
⑹、接口Queue没有定义有关阻塞队列(blocking queue)的方法,阻塞队列在并发编程中非常常见,它包括以下两种类型的方法:
①、有关目标元素出现如何处理(目标元素未出现时阻塞)
②、有关Queue出现可用空间如何处理(Queue无可用空间时阻塞)
阻塞队列的方法定义在java.util.concurrent.BlockingQueue接口中,它继承自接口Queue。
⑺、Queue的实现一般不允许添加null元素,尽管某些实现允许,比如LinkedList,就算如此,也不应将null添加到Queue中,因为方法poll()会返回null以表示当前Queue不包含任何元素。
⑻、Queue的实现类通常不会为方法equals()和方法hashCode()提供实现,主要有以下两个原因:
①、同一个Queue中可能存在两个完全相同的元素。
②、同一个Queue可能会使用不同的排序策略(一旦排序策略改变,方法equals()的代码肯定也要改变)。
⑼、接口Queue是Java Collections Framework中的重要一员。
1、add(E e)

//如果当前Queue有可用空间(没有容量限制)
//则立即将指定元素e添加进去并返回true
//如果当前Queue没有可用空间(有容量限制)
//则抛出IllegalStateException异常,添加元素失败
//方法返回类型为boolean
//元素添加成功返回true,添加失败应该返回false,但是却设计为
//抛出异常...差评
boolean add(E e);

2、offer(E e)

//如果当前Queue有可用空间(没有容量限制)
//则立即将指定元素e添加进去并返回true
//如果当前Queue没有可用空间(有容量限制)
//则返回false,添加元素失败
//它比方法add(E e)设计更合理,在使用有容量限制的
//Queue时,应优先使用
boolean offer(E e);

3、remove()

//删除并返回当前Queue的头元素
//如果当前Queue为空,则抛出NoSuchElementException异常
//在使用这个方法的时候,不需要额外确定当前Queue是否允许添加null元素
//如果当前Queue为空,那么既不能实行删除操作
//也不能返回任何元素,直接抛出异常是合理的
E remove();

4、poll()

//删除并返回当前Queue的头元素
//如果当前Queue为空,则返回null
//在使用这个方法的时候,需要额外确定当前Queue是否允许添加null元素
//如果当前Queue不允许添加null元素,则返回null能说明当前Queue为空
//否则不能,所以无论当前Queue是否允许添加null元素,在它为空的时候都应该
//有显示的提示.方法E remove()直接抛出异常是更合理的处理方式
E poll();

5、element()

//仅返回(不删除)当前Queue的头元素
//如果当前Queue为空,则抛出NoSuchElementException异常
//如果当前Queue为空,就不能返回任何元素,直接抛出异常是合理的
E element();

6、peek()

//仅返回(不删除)当前Queue的头元素
//如果当前Queue为空,则返回null
//在使用这个方法的时候,需要额外确定当前Queue是否允许添加null元素
//如果当前Queue不允许添加null元素,则返回null能说明当前Queue为空
//否则不能,所以无论当前Queue是否允许添加null元素,在它为空的时候都应该
//有显示的提示.方法E element()直接抛出异常是更合理的处理方式
E peek();

PS:时间有限,有关Java SE的内容会持续更新!今天就先写这么多,如果有疑问或者有兴趣,可以加QQ:2649160693,并注明CSDN,我会就博文中有疑义的问题做出解答。同时希望博文中不正确的地方各位加以指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值