Java 数据结构 Note
uwupu 啦啦啦啦啦

Java中的队列

Queue

API

功能 抛出异常 返回false或null
添加 add() offer()
查询不删除 element() peek()
查询并删除 remove() poll()

Deque

双端队列

功能 抛出异常 返回false或null
添加到队列尾部 add() offer()
addLast() offerLast()
添加到队列头部 push()
addFirst() offerFirst()
查询不删除头部 element() peek()
getFirst() peekFirst()
查询不删除尾部 getLast() peekLast()
查询并删除头部 remove()/pop() poll()
removeFirst() pollFirst()
查询并删除尾部 removeLast() pollLast()

BlockingQueue

阻塞队列,线程安全

功能 抛出异常 返回false或null 阻塞 阻塞等待,超时抛出异常
添加 add() offer() put() offer(E e,long timeout,TimeUnit unit)
查询并删除 take() poll(long timeout,TimeUnit unit)

其他API

int remainingCapacity():返回剩余容量;

boolean remove(Object o):删除一个指定元素,成功返回true;

boolean contains(Object o):若队列包含指定元素,返回true;

int drainTo(Collection<? super E> c):队列中删除所有元素,并将元素添加到指定集合;

int drainTo(Collection<? super E> c,int maxElements):同上,可以指定最大元素数量;

BlockingDeque

阻塞队列和双端队列的结合;

新增的API

等待

takeFirst / take:查询并删除队列第一个元素,如果没有则阻塞;

takeLast:查询并删除队列最后一个元素,没有则阻塞;

putFirst / putLast:插入元素,若队列满则阻塞等待;

等待超时

offerFirst(E e, long timeout,TimeUnit unit):添加元素到队首,若队列满则等待;

offerofferLast(E e,long timeout,TimeUnit unit):同上;

pollFirst(long timeout,TimeUnit unit):查询并删除第一个元素,队列空则等待,超时则抛出错误;

pollLast(long timeout,TimeUnit unit):同上;

LinkedBlockingDeque

链表实现的双端阻塞队列

ArrayBlockingQueue

数组实现的阻塞队列

可以给定容量和访问策略

  • ArrayBlockingQueue(int capacity)
  • ArrayBlockingQueue(int capacity,boolean fair)
  • ArrayBlockingQueue(int capacity,boolean fair,Collection<?extends E> c)

PriorityBlockingQueue

优先队列的阻塞版本

不允许有null元素

SynchronousQueue

  • 没有容量的同步队列。

  • 一旦有消费或生产过程,就必须有相应的生产或消费过程,否则阻塞;

  • 队列中没有容量,在这个队列中,不参与等待的API一律返回null,比如:

    • remove、containsAll、removeAll、retainAll永远返回false;
    • peek永远返回null。

可以指定访问策略

  • SynchronousQueue(),创建一个不公平的同步队列;
  • SynchronousQueue(boolean fair),指定公平/不公平。
API

put(E e):将元素添加到队列,然后阻塞等待另一个线程接收元素;

offer(E e, long timeout,TimeUnit unit):将元素插入到队列中,等待消费者消费,超时则hole..;

offer(E e):若有另一个线程在等待接收元素,则将元素插入到队列中,否则返回false;

take():查询队列首元素,删除元素并返回,若队列中没有数据则阻塞等待;

poll(long timeout,TimeUnit unit):查询队列首元素,删除元素并返回,若队列空则等待,超时返回null;

poll():查询队列首元素,删除元素并返回,若队列空则返回null;

TransferQueue

这个队列可以实现生产者消费者程序,并协调消息使消息能够从生产者传输到消费者;

新增API

getWaitingConsumerCount():获取等待的消费者数量;

hasWaitingConsumer():获取是否有消费者在等待;

transfer():将元素交给消费者,如果没有消费者,则等待;

tryTransfer():将元素交给消费者,若没有消费者,则抛弃元素,返回false;

tryTransfer(E e,long timeout,Timeunit unit):将元素交给消费者,若没有消费者,则等待,超时则抛弃元素,返回false;

LinkedTransferQueue

链表实现的TransferQueue。

特别的API
  • transfer:将元素转移给消费者,若没有消费者,则等待;
    • 将元素插入到队列尾部,然后等待消费者消费;
  • tryTransfer(E e, long timeout, TimeUnit unit):将元素插入队列,然后等待消费者消费;若超时,则取消阻塞,返回false;成功返回true;
  • take:从队列的头中取出元素,若没有元素则等待;
  • poll(long timeout, TimeUnit unit):take的超时版本,从队列的头中取出元素,若没有元素则等待,超时返回null;
  • poll():从队列头部取出元素,若没有元素,则返回null;
  • peek():查询不删除队列头部元素,若队列空,则返回null;

AbstractQueue

API

add(E e):添加元素,失败抛出异常;

addAll(Collection<? extends E> c):添加元素,失败抛出异常;

clear:删除所有元素;

element:查询不删除头部元素;

remove:查询并删除头部元素;

ConcurrentLinkedQueue

基于链表无界线程安全队列;

线程不安全,基于链表的队列;

PriorityQueue优先队列

特点

  1. 无限长的队列,并且动态增长,默认初始容量可以用构造参数initialCapacity参数覆盖;
  2. 不允许有NULL对象;
  3. 添加到PriorityQueue的对象必须有可比性;
  4. 默认情况下,队列按自然顺序排序;
  5. 比较器可用于队列中对象的自定义排序;
  6. 线程不安全;
  7. add和poll方法复杂度:O(log(n))

API

  • boolean add(object) 将指定对象插入;

  • boolean offer(object) 将指定对象插入;

  • boolean remove(object) 从此队列删除指定元素的单个实例;

  • Object poll():删除并返回队列的头部,若队列为空,返回null;

  • Object element():获取队列头部;

  • Object peek():获取队列头部;

  • clear():从队列中删除所有元素;

  • comparator():返回队列的比较器;

  • contains(Object o):是否包含指定元素。

一些API的区别

add、remove、element:抛出异常;

offer、poll、peek:不抛出异常,返回null;

抛出异常 不抛出异常
添加 add offer
删除 remove poll
获取首元素 element peek
 评论