Java ArrayDeque的介绍
1.概述
在本教程中,我们将展示如何使用Java的ArrayDeque类 – 它是Deque接口的一个实现。
ArrayDeque(也被称为“Array Double Ended Queue”,发音为“ArrayDeck”)。是一种特殊的可增长数组,它允许我们从两边增加或删除一个元素。
ArrayDeque的实现可以作为Stack(后进先出)或Queue(先入先出)使用。
2.API概览
对于每一项操作,我们基本上有两个选择。
第一组包含在操作失败时抛出异常的方法。另一组返回状态或值:
操作 | 方法 | 方法抛出异常 |
从头部插入 | offerFirst(e) | addFirst(e) |
从头部移除 | pollFirst() | removeFirst() |
从头部检索 | peekFirst() | getFirst() |
从尾部插入 | offerLast(e) | addLast(e) |
从尾部去除 | pollLast() | removeLast() |
从尾部检索 | peekLast() | getLast() |
3.使用方法
让我们来看看几个简单的例子,看看我们如何利用ArrayDeque。
3.1.将ArrayDeque作为Stack
我们将从一个例子开始,说明我们如何把类当作一个Stack – 并push一个元素。
@Test
public void whenPush_addsAtFirst() {
Deque<String> stack = new ArrayDeque<>();
stack.push("first");
stack.push("second");
assertEquals("second", stack.getFirst());
}
让我们也来看看我们如何从ArrayDeque –中弹出一个元素,当作为一个堆栈使用时。
@Test
public void whenPop_removesLast() {
Deque<String> stack = new ArrayDeque<>();
stack.push("first");
stack.push("second");
assertEquals("second", stack.pop());
}
当堆栈是空的时候,pop方法会抛出NoSuchElementException。
3.2.将ArrayDeque作为Queue使用
现在让我们从一个简单的例子开始,展示我们如何在ArrayDeque –中提供一个元素,当作为一个简单的Queue使用时。
@Test
public void whenOffer_addsAtLast() {
Deque<String> queue = new ArrayDeque<>();
queue.offer("first");
queue.offer("second");
assertEquals("second", queue.getLast());
}
让我们看看我们如何从ArrayDeque中轮询一个元素,也是作为一个Queue使用的。
@Test
public void whenPoll_removesFirst() {
Deque<String> queue = new ArrayDeque<>();
queue.offer("first");
queue.offer("second");
assertEquals("first", queue.poll());
}
如果一个队列是空的,poll方法就会返回一个null值。
4.如何实现ArrayDeque?
在引擎盖下,ArrayDeque 由一个数组支持,该数组在填充时将其大小加倍。
最初,数组的初始化大小为16。它被实现为一个双端队列,它维护着两个指针,即头和尾。
让我们在较高的层次上看看这个逻辑的实际应用。
4.1. ArrayDeque 作为堆栈
可以看出,当用户使用push方法加入一个元素时,它将头部指针移动了一个。
当我们弹出一个元素时,它将头部位置的元素设置为null,这样该元素就可以被垃圾回收,然后将头部指针向后移动一个。
4.2.ArrayDeque作为一个Queue
当我们使用offer方法加入一个元素时,它将尾部指针移动了一个。
当用户轮询一个元素时,它将头部位置的元素设置为null,这样该元素就可以被垃圾回收,然后移动头部指针。
4.3.关于ArrayDeque的说明
最后,关于这个特定的实现,还有一些值得理解和记住的注意事项:
- 这不是线程安全的。
- 不接受空的元素
- 比同步的Stack工作速度快得多。
- 它是一个比LinkedList更快的队列,因为有更好的引用位置性。
- 大多数操作都有摊销后的恒定时间复杂度
- 由ArrayDeque返回的Iterator是快速失败的。
- ArrayDeque在添加元素时,当头部和尾部的指针相遇时,会自动将数组的大小翻倍。
5.总结
在这篇短文中,我们说明了ArrayDeque中的方法的用法。
所有这些例子的实现都可以在GitHub项目中找到;这是一个基于Maven的项目,所以应该很容易导入并按原样运行。