Java SE 是什么,包括哪些内容(二十一)?
本文内容参考自Java8标准
队列的根接口:
Queue
Collection | Queue |
---|---|
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() |
接口声明:
源代码图示(图下面有解释说明):
英文注释分别阐述了以下内容(一个段落用一个小标):
⑴、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,我会就博文中有疑义的问题做出解答。同时希望博文中不正确的地方各位加以指正。