队列
队列一种特殊的线性表, 插入和删除操作分别在表的两端进行,特点是先进先出。把插入元素叫入队,这端叫对尾,删除元素叫出队,称为队尾。
java 队列接口的设计
Queue
public interface Queue<E> extends Collection<E>{
// 添加一个元素 , 队列已满抛出异常
boolean add(E e);
// 添加一个元素 , 队列已满抛返回false
boolean offer(E e);
//移除并返回队列头部的元素,如果队列为空 则抛出异常
E remove();
//移除并返回队列头部的元素,如果队列为空返回null
E poll();
//返回队列头部的元素,如果队列为空 则抛出异常
E element();
//返回队列头部的元素,如果队列为空返回null
E peek();
}
Deque
双向队列, 支持从两端点的检索 插入 删除元素
可以支持 先进先出, 先进后出的形式
public interface Deque<E> extends Queue<E> {
// 队列头添加一个元素 , 队列已满抛出异常
void addFirst(E e);
// 队列尾添加一个元素 , 队列已满抛出异常
void addLast(E e);
// 队列满 返回特殊值
boolean offerFirst(E e);
// 队列满 返回特殊值
boolean offerLast(E e);
//移除并返回队列头部的元素,如果队列为空 则抛出异常
E removeFirst();
//移除并返回队列尾部的元素,如果队列为空 则抛出异常
E removeLast();
//移除并返回队列头部的元素,如果队列为空返回null
E pollFirst();
//移除并返回队列头部的元素,如果队列为空返回null
E pollLast();
// Retrieves, but does not remove, the first element of this deque. throws an exception if this deque is empty
E getFirst();
//Retrieves, but does not remove, the last element of this deque. throws an exception if this deque is empty
E getLast();
// Retrieves, but does not remove, the first element of this deque. return {@code null} if this deque is empty
E peekFirst();
// Retrieves, but does not remove, the last element of this deque, returns {@code null} if this deque is empty
E peekLast();
}
BlockingQueue
堵塞队列的设计
增加4个附加操作
1. 队列为空 增加获取元素线程被堵塞直到队列变为非空
2. 队列为满时 , 添加元素线程被堵塞直到队列不满
3. 在上述2种情况下,设计有限时间的堵塞。超时后返回失败
public interface BlockingQueue<E> extends Queue<E> {
boolean add(E e);
boolean offer(E e);
// 添加一个元素 , 队列已满则一直堵塞, 直到队列不满或者被中断
void put(E e) throws InterruptedException;
//添加一个元素,队列已满则进入等待
boolean offer(E e, long timeout, TimeUnit unit)throws InterruptedException;
//返回队列头部的元素,如果队列为空,则堵塞
E take() throws InterruptedException;
// 返回队列头部的元素,如果队列为空,则等待
E poll(long timeout, TimeUnit unit)throws InterruptedException;
//一次性取走 BlockingQueue中的数据 到C中
int drainTo(Collection<? super E> c);
//一次性取走 指定的BlockingQueue中的数据 到C中
int drainTo(Collection<? super E> c, int maxElements);
}
网友评论