1.队列
队列,一种支持先进先出(FIFO)的线性数据结构。
最常见的场景就是,排队买票,排在前面的先买到票,先离开。
新来的人排在队列尾部。(当然这里是不允许插队的,可是现实生活中插队的人还不少,哎)
队列接口如下:
//队列元素类型以泛型E表示,使用实现类时自己指定,比如String,Persion等
public interface Queue<E> extends Collection<E>
接口基本方法包括:
/**
* 不做验证的添加元素,成功返回true,失败抛异常。
* @throws IllegalStateException 空间不足
* @throws ClassCastException 类型不兼容,加入的元素不是队列元素类型或者元素的子类。(即队列中所有元素必须是同一类的)
* @throws NullPointerException 加入的元素是null
* @throws IllegalArgumentException if some property of this element prevents it from being added to this queue(字面意思是添加元素的某些属性阻止其加入队列)
*/
boolean add(E e);
/**
* 比add多一个容量验证,成功加入返回true,容量不够返回false。
*/
boolean offer(E e);
/**
* 从队列头部移除元素并返回
* 此方法不做队列是否为空检查,队列为空会抛NoSuchElementException异常
*/
E remove();
/**
* 从队列头部移除元素并返回
* 此方法与remove不同的是,如果队列为空,则返回null
*/
E poll();
/**
* 从队列头部返回一个元素但不删除
* 队列为空,抛NoSuchElementException异常
*/
E element();
/**
* 从队列头部返回一个元素但不删除
* 队列为空,返回null
*/
E peek();
小结:
add 对应 offer,用来添加元素,前者不做验证,空间不够就抛异常,后者空间不够返回false。
remove 对应 poll,用来删除和获取队首元素,前者不做验证,没有元素就抛异常,后者返回null。
element 对应 peek,用来获取队首元素,前者不做验证,没有元素就抛异常,后者返回null。
2.阻塞队列
特点:
- 队列为空,获取元素的线程等待队列变为非空
- 队列为满,获取元素的线程等待队列可用
阻塞队列接口
public interface BlockingQueue<E> extends Queue<E>
在Queue基础上扩展了如下方法:
/**
* 往队列添加元素
* 队列满的情况会阻塞,等待队列可用
* 等待被打断会抛InterruptedException
*/
void put(E e) throws InterruptedException;
/**
* 从队列头部删除并返回元素
* 队列为空的情况会阻塞,等待队列中有元素
* 等待被打断会抛InterruptedException
*/
E take() throws InterruptedException;
/**
* 队列为空的情况会阻塞,等待队列中有元素
* 队列为空的情况会阻塞,等待队列中有元素,等待时间有timeout指定,unit是等待的时间单位
* 超时未获取元素,返回null
*/
E poll(long timeout, TimeUnit unit) throws InterruptedException;
/**
* 检查队列还能插多少个元素(理想情况向下,因为检查后,可能其他线程已经操作了队列)
* 如果是无界队列,则返回Integer.MAX_VALUE。
*/
int remainingCapacity();
/**
* 从队列中删除指定的元素,如果有多个,只删除一个
*/
boolean remove(Object o);
/**
* 判断队列中是否包含某个元素
*/
boolean contains(Object o);
/**
* 元素搬家,把队列中的所有元素转移到给定的集合中(原队列中元素将被删除)
* 返回转移的元素数量
*/
int drainTo(Collection<? super E> c);
/**
* 元素搬家,多了一个指定最多搬多少个元素到新的集合中
*/
int drainTo(Collection<? super E> c, int maxElements);
小结:
- 比起普通的队列,添加元素多了阻塞的put和offer方法。offer的重载方法提供了一个阻塞时间。
- 比起普通的队列,获取元素多了阻塞的take和poll方法。poll的重载方法提供一个阻塞时间。
总结:
添加元素
- add只管加,空间不够抛异常。
- offer只有空间够才能加,不够返回false。
- put空间够才能加,不够就等。
- offer(重载)空间够才能加,不够等待指定时间,超时返回null。
删除元素
- remove 只管删,没有元素抛异常
- poll 没有元素返回null
- take 没有元素就等
- poll(重载)没有元素等待指定时间,超时返回null。