这部分内容本来是放在Collection-Framework(1)里面的,但是内容太多导致生成html后,部署到github pages发现部分内容丢失,只能拆开分成几个部分了。
PriorityQueue
无边界的优先级队列的实现,队列里面的元素按照自然顺序顺序或者用户自定义的Comparator规则进行排序。
它不允许插入null元素,不是线程安全的。
成员变量
private static final int DEFAULT_INITIAL_CAPACITY = 11; |
构造函数
/** |
常用方法
public boolean add(E e)
public boolean offer(E e)
往队尾插入一个元素public E peek()
获取队头的元素public boolean remove(Object o)
public boolean contains(Object o)
public Iterator
iterator() public void clear()
public E poll()
移除队头的元素(队列是FIFO)public Comparator<? super E> comparator()
ArrayBlockingQueue
有边界的阻塞队列,底层是数组实现的,该类位于concurrent包下,是线程安全的,不允许插入null元素。因为它是有边界的,
因此在元素填满队列之后再往里面添加元素将会发生阻塞,直到有空余的位置可以插入元素,往空队列取出元素的时候同理。
成员变量
/** The queued items */ |
构造函数
|
常用方法
public boolean add(E e)
往队尾插入一个元素,如果队列已满则抛出IllegalStateExceptionpublic boolean offer(E e)
往队尾插入一个元素,如果队列已满则立即返回falsepublic boolean offer(E e, long timeout, TimeUnit unit)
public void put(E e)
往队尾插入一个元素,如果队列已满则发生阻塞直到成功插入元素public E poll()
取出队头元素,如果队列为空则立即返回nullpublic E poll(long timeout, TimeUnit unit)
public E take()
取出队头元素,如果队列为空则发生阻塞一直到成功取出元素为止public E peek()
获取队头元素(不移除),队列为空则返回nullpublic int size()
public int remainingCapacity()
public boolean remove(Object o)
public boolean contains(Object o)
public void clear()
public Iterator
iterator()
LinkedBlockingQueue
可自定义边界范围的阻塞队列,底层基于链表实现,是线程安全的,不允许存放null
成员变量
/** The capacity bound, or Integer.MAX_VALUE if none */ |
构造函数
|
常用方法
public int size()
public int remainingCapacity()
public void put(E e)
往队尾添加一个元素,如果队列已满则发生阻塞直到成功存储元素public boolean offer(E e, long timeout, TimeUnit unit)
往队尾添加一个元素,队列已满则等待一段时间(timeout),超时后没能成功添加元素则返回falsepublic boolean offer(E e)
往队尾添加一个元素,失败立即返回false,不发生阻塞public E take()
取出队头元素(移除),如果队列为空则发生阻塞直到成功取出元素public E poll()
取出队头元素(移除),成功则返回该元素,不成功返回null,不发生阻塞public E poll(long timeout, TimeUnit unit)
取出队头元素(移除),队列为空则等待一段时间(timeout),超时后仍未成功取出元素则返回nullpublic E peek()
获取队头元素(不移除),队列为空则返回null,不发生阻塞public boolean remove(Object o)
移除指定元素,成功返回true,不成功返回false,不发生阻塞public boolean contains(Object o)
public void clear()
public Iterator
iterator()
ConcurrentLinkedQueue
无边界的非阻塞队列,底层基于链表,线程安全,不允许存放null元素。
成员变量
|
构造函数
|
常用方法
public boolean add(E e)
往队尾插入一个元素,因为这是一个无边界的队列,因此该方法永远不会抛出IllegalStateException或者返回falsepublic boolean offer(E e)
往队尾插入一个元素,和上面的方法一样,该方法能返回ture或者抛出空指针异常public E poll()
取出队头元素(移除),不发生阻塞public E peek()
获取队头元素(不移除),不发生阻塞public boolean isEmpty()
public int size()
如果队列中的元素数量大于Integer.MAX_VALUE,则返回Integer.MAX_VALUE,该方法的时间复杂度不为O(1),而是 O(n)public boolean contains(Object o)
public boolean remove(Object o)
移除元素,不发生阻塞public boolean addAll(Collection<? extends E> c)
试图将添加自己的元素到队列中将抛出IllegalArgumentException,比如queue.add(queue)
public Iterator
iterator()
Queue总结
- 队列是FIFO(先进先出)的
- 有阻塞队列和非阻塞队列,阻塞队列的阻塞是基于Condition实现的
- peek()只获取队头元素,而不移除元素,而且不发生阻塞
- 在阻塞队列中,poll()和offer()均不发生阻塞,take()可能发生阻塞
ArrayDeque
双向队列,底层基于数组实现,大小可以动态变化,因此没有容量限制,不是线程安全的,
成员变量
/** |
构造函数
|
常用方法
public void addFirst(E e)
添加元素到队头,没有返回值public void addLast(E e)
添加元素到队尾public boolean offerFirst(E e)
插入元素到队头,只返回true或者抛出异常public boolean offerLast(E e)
插入元素到队尾,只返回true或者抛出异常public E removeFirst()
移除队头元素,没有元素则抛出异常public E removeLast()
移除队尾元素,没有元素则抛出异常public E pollFirst()
移除队头元素,没有元素则返回nullpublic E pollLast()
移除队尾元素,没有元素则返回nullpublic E getFirst()
获取队头元素(不移除),不存在则抛出异常public E getLast()
获取队尾元素(不移除),不存在则抛出异常public E peekFirst()
获取队头元素(不移除),不存在则返回nullpublic E peekLast()
获取队尾元素(不移除),不存在则返回nullpublic boolean removeFirstOccurrence(Object o)
移除第一个出现的特定队列元素(从队头到队尾遍历),元素不存在返回falsepublic boolean removeLastOccurrence(Object o)
移除最后一个出现的特定队列元素(从队尾到队头遍历),元素不存在返回falsepublic boolean add(E e)
同addLastpublic boolean offer(E e)
同offerLastpublic E remove()
移除队头元素,如果队列中没有元素则抛出异常public E poll()
移除队头元素,如果队列中没有元素则返回nullpublic E element()
获取队头元素(不移除),如果队列中没有元素则抛出异常public E peek()
获取队头元素(不移除),如果队列中没有元素则返回nullpublic void push(E e)
同addFirst,模拟栈的push操作,这里将向队头添加一个元素public E pop()
同removeFirst,模拟栈的pop操作,这里将移除队头元素,队列中元素为空则抛出异常public int size()
public boolean isEmpty()
public Iterator
iterator() public Iterator
descendingIterator() public boolean contains(Object o)
public boolean remove(Object o)
元素不存在则返回falsepublic void clear()
LinkedBlockingDeque
可设置边界的阻塞队列,底层实现基于链表,不是线程安全的。
Most operations run in constant time (ignoring time spent
blocking). Exceptions include {@link #remove(Object) remove},
{@link #removeFirstOccurrence removeFirstOccurrence}, {@link
#removeLastOccurrence removeLastOccurrence}, {@link #contains
contains}, {@link #iterator iterator.remove()}, and the bulk
operations, all of which run in linear time.
该类的大多数操作都只需要常量时间O(1),remove
,removeFirstOccurrence
,removeLastOccurrence
,contains
,iterator
,iterator.remove
等方法和其它聚集操作需要线性时间O(n)
成员变量
/** |
构造函数
/** |
常用方法
public void addFirst(E e)
添加元素到队头,如果队列已满则抛出异常,不发生阻塞public void addLast(E e)
添加元素到队尾部,如果队列已满则抛出异常,不发生阻塞public boolean offerFirst(E e)
添加元素到队头,如果队列已满则返回false,不发生阻塞public boolean offerLast(E e)
添加元素到队尾,如果队列已满则返回false,不发生阻塞public void putFirst(E e)
添加元素到队头,如果队列已满则抛发生阻塞直到成功放入元素public void putLast(E e)
添加元素到队尾,如果队列已满则抛发生阻塞直到成功放入元素public boolean offerFirst(E e, long timeout, TimeUnit unit)
添加元素到队头,队列已满则等待一定时间(timeout),超时后返回falsepublic boolean offerLast(E e, long timeout, TimeUnit unit)
添加元素到队尾,队列已满则等待一定时间(timeout),超时后返回falsepublic E removeFirst()
移除队头元素,队列为空则抛出异常,不发生阻塞public E removeLast()
移除队尾元素,队列为空则抛出异常,不发生阻塞public E pollFirst()
移除队头元素,队列为空则返回null,不发生阻塞public E pollLast()
移除队尾元素,队列为空则返回null,不发生阻塞public E takeFirst()
获取并移除队头元素,对垒为空则一直阻塞到成功取出元素public E takeLast()
获取并移除队尾元素,对垒为空则一直阻塞到成功取出元素public E pollFirst(long timeout, TimeUnit unit)
public E pollLast(long timeout, TimeUnit unit)
public E getFirst()
获取(不移除)队头元素,如果队列为空则抛出异常public E getLast()
获取(不移除)队尾元素,如果队列为空则抛出异常public E peekFirst()
同getFirst,不过队列为空时返回null,不抛出异常public E peekLast()
public boolean removeFirstOccurrence(Object o)
public boolean removeLastOccurrence(Object o)
public boolean add(E e)
同addLastpublic boolean offer(E e)
调用了offerLastpublic void put(E e)
调用了putLastpublic boolean offer(E e, long timeout, TimeUnit unit)
public E poll()
和removeFirst相同,但是该方法在队列为空时抛出异常public E take()
调用了takeFirstpublic E poll(long timeout, TimeUnit unit)
public E element()
调用了getFirstpublic E peek()
调用了peekFirstpublic int remainingCapacity()
public void push(E e)
调用了addFirstpublic E pop()
调用了removeFirstpublic boolean remove(Object o)
调用了removeFirstOccurrencepublic int size()
public boolean contains(Object o)
public void clear()
public Iterator
iterator() public Iterator
descendingIterator()
ConcurrentLinkedDeque
基于链表的无边界非阻塞双向队列,是线程安全的。
成员变量
/** |
构造方法
/** |
常用方法
和LinkedBlockingDeque差不多,不过方法都是非阻塞的
Deque总结
- Deque是双向队列,队列两端都可以进行插入和移除操作
- 一般add在队列满时抛出异常,offer不抛出异常,remove和poll同理
- put和take在阻塞队列中是阻塞的
- peek和get只获取元素而不移除元素,get在队列为空时抛出异常,peek不抛出异常
- push和pop模拟栈的操作,push是往队头添加一个元素,pop是移除队头元素,队列为空或者满时都将抛出异常