文章目录
Queue
特点:
- Queue是Collection的子接口
- 数据结构表现为:队列
- 存储元素有序
- 存储元素可重复
- 不能存储null(除了LinkedList子实现)
Queue的API
boolean add(E e):
// 将指定的元素插入此队列(如果立即可行且不会违反容量限制)
// 在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。
E element() : // 获取,但是不移除此队列的头。
// 如果队列为空则会抛出异常:NoSuchElementException
E remove(): // 获取并移除此队列的头。
// 没有元素的时候会抛出异常:NoSuchElementException
boolean offer(E e):
// 将指定的元素插入此队列(如果立即可行且不会违反容量限制)
// 当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。
// offer的返回值:true表示添加成功;false表示添加失败
E peek(): // 获取但不移除此队列的头;
// 如果此队列为空,则返回 null。
E poll(): // 获取并移除此队列的头
// 如果此队列为空,则返回 null。
抛出异常 | 返回特殊值 | |
---|---|---|
增加元素 | add(e) | offer(e) |
移除元素 | remove() | poll() |
查看元素 | element() | peek() |
特殊情况:
- 添加的时候,队列满了
- 删除的时候,队列空了
Deque
双端队列。可以从两端进出的线性表。
特点:
- Deque是Queue的子接口
- 数据结构表现:队列,栈,双端队列
- 存储元素有序
- 可存储重复元素
- 不能存储null(LinkedList除外)
Deque的API
作为Queue的API(增、删、查)
E peek(); // 获取队头元素,但不移除它
E poll() // 从队头移除元素
boolean offer(E e); // 添加一个元素到队尾
作为Stack的API
E pop(); // 从此列表所表示的堆栈处弹出一个元素
void push(E e); // 将元素推入此列表所表示的堆栈。
作为双端队列的API
boolean offerFirst(E e): // 从第一个位置插入指定元素
boolean offerLast(E e):// 从最后一个位置插入指定元素
E peekFirst():// 获取但是不移除第一个元素,如果列表为空,返回null
E peekLast():// 获取但是不移除最后一个元素,如果列表为空,返回null
E pollFirst():// 从第一个位置移除元素
E pollLast():// 从最后一个位置移除元素,如果列表为空,返回null
使用deque去模拟双端队列的两种方式:
- 从队尾进,从队头出
- 从队头进,从队尾出
作为普通List的API
boolean add(E e): // 将指定元素添加到此列表的结尾。
E remove():// 获取并移除此列表的头(第一个元素)。
void addFirst(E e): // 将指定元素插入此列表的开头。
void addLast(E e): // 将指定元素添加到此列表的结尾。
E getFirst():// 返回此列表的第一个元素。
E getLast(): // 返回此列表的最后一个元素。
E removeFirst(): // 移除并返回此列表的第一个元素。
E removeLast():// 移除并返回此列表的最后一个元素。
boolean removeFirstOccurrence(Object o):// 从此列表中移除第一次出现的指定元素
boolean removeLastOccurrence(Object o):// 从列表中移除最后一次出现的指定元素
Iterator<E> descendingIterator():// 获取一个倒序的迭代器
E element():// 获取元素
第一个元素(头部) | 第一个元素(头部) | 最后一个元素(尾部) | 最后一个元素(尾部) | |
---|---|---|---|---|
抛出异常 | 特殊值 | 抛出异常 | 特殊值 | |
插入 | addFirst(e) | offerFirst(e) | addLast(e) | offerLast(e) |
移除 | removeFirst() | pollFirst() | removeLast() | pollLast() |
获取 | getFirst() | peekFirst() | getLast() | peekLast() |
Queue 方法 | 等效 Deque 方法 |
---|---|
add(e) | addLast(e) |
offer(e) | offerLast(e) |
remove() | removeFirst() |
poll() | pollFirst() |
element() | getFirst() |
peek() | peekFirst() |
ArrayDeque
特点:
- ArrayDeque是Deque的子实现
- 数据结构表现:队列,栈,双端队列
- 底层实现: 循环数组
- 存储元素有序
- 存储元素可重复
- 不可存储null
ArrayDeque的构造方法:
容量问题:
如果传入的初始化容量小于8,则直接分配8个空间,如果传入的数字大于8,则直接找到大于8的最近一个2的幂次方。
为什么要分配2的幂次方?
方便进行取模操作。(注:a % b = a & (b-1)
)
BlockingQueue
阻塞队列:一个大小有限的队列
-
插入时,当队列满了,插入线程阻塞住。
-
从队列中获取元素时,当队列空了,获取线程阻塞住。
抛出异常 | 特殊值 | 阻塞 | 超时 | |
---|---|---|---|---|
插入 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
移除 | remove() | poll() | take() | poll(time, unit) |
检查 | element() | take() | - | - |
可以用BlockingQueue进行生产者-消费者问题