- ArrayDeque 又实现了 Deque 接口(Deque 又实现了 Queue 接口)
| public class ArrayDeque<E> extends AbstractCollection<E> |
| implements Deque<E>, Cloneable, Serializable |
| {} |
Queue Method |
Equivalent Deque Method |
说明 |
add(e) |
addLast(e) |
向队尾插入元素,失败则抛出异常 |
offer(e) |
offerLast(e) |
向队尾插入元素,失败则返回false |
remove() |
removeFirst() |
获取并删除队首元素,失败则抛出异常 |
poll() |
pollFirst() |
获取并删除队首元素,失败则返回null |
element() |
getFirst() |
获取但不删除队首元素,失败则抛出异常 |
peek() |
peekFirst() |
获取但不删除队首元素,失败则返回null |
Stack Method |
Equivalent Deque Method |
说明 |
push(e) |
addFirst(e) |
向栈顶插入元素,失败则抛出异常 |
无 |
offerFirst(e) |
向栈顶插入元素,失败则返回false |
pop() |
removeFirst() |
获取并删除栈顶元素,失败则抛出异常 |
无 |
pollFirst() |
获取并删除栈顶元素,失败则返回null |
peek() |
getFirst() |
获取但不删除栈顶元素,失败则抛出异常 |
无 |
peekFirst() |
获取但不删除栈顶元素,失败则返回null |
addFirst()
| |
| public void addFirst(E e) { |
| |
| if (e == null) |
| throw new NullPointerException(); |
| |
| elements[head = (head - 1) & (elements.length - 1)] = e; |
| |
| if (head == tail) |
| |
| doubleCapacity(); |
| } |
| |
| private void doubleCapacity() { |
| |
| assert head == tail; |
| int p = head; |
| int n = elements.length; |
| |
| int r = n - p; |
| |
| int newCapacity = n << 1; |
| if (newCapacity < 0) |
| throw new IllegalStateException("Sorry, deque too big"); |
| Object[] a = new Object[newCapacity]; |
| |
| System.arraycopy(elements, p, a, 0, r); |
| |
| System.arraycopy(elements, 0, a, r, p); |
| |
| elements = a; |
| head = 0; |
| tail = n; |
| } |
- 当b是2的n次方时,
a & (b - 1) = a % b
,head & (elements.length - 1)
等价于 head % elements.length
addLast()
| public void addLast(E e) { |
| if (e == null) |
| throw new NullPointerException(); |
| elements[tail] = e; |
| if ((tail = (tail + 1) & (elements.length - 1)) == head) |
| doubleCapacity(); |
| } |
pollFirst()
pollFirst()
的作用是删除并返回Deque首端元素,也即是head
位置处的元素。如果容器不空,只需要直接返回elements[head]
即可,当然还需要处理下标的问题。由于ArrayDeque
中不允许放入null
,当elements[head] == null
时,意味着容器为空。
| public E pollFirst() { |
| int h = head; |
| @SuppressWarnings("unchecked") |
| E result = (E) elements[h]; |
| |
| |
| if (result == null) |
| return null; |
| elements[h] = null; |
| head = (h + 1) & (elements.length - 1); |
| return result; |
| } |
pollLast()
| |
| public E pollLast() { |
| int t = (tail - 1) & (elements.length - 1); |
| @SuppressWarnings("unchecked") |
| E result = (E) elements[t]; |
| if (result == null) |
| return null; |
| elements[t] = null; |
| tail = t; |
| return result; |
| } |
peekFirst()
| |
| public E peekFirst() { |
| |
| return (E) elements[head]; |
| } |
peekLast()
| |
| public E peekLast() { |
| return (E) elements[(tail - 1) & (elements.length - 1)]; |
| } |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/18300954
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步