介绍:
Java中的ArrayDeque是实现Deque接口的类。 它是双端队列的基于数组的实现。 顾名思义,双端队列是允许我们在前端和后端添加或删除项目的队列。
在开始之前,让我们快速看一下ArrayDeque上的一些值得注意的点:
- ArrayDeque没有容量限制。 数组的大小根据需要动态增长
- 我们不能将空值添加到ArrayDeque
- 这不是线程安全的实现
- 由于双端队列为双端,我们可以使用它作为一个堆栈或队列
实例化
我们可以使用以下构造函数之一来实例化ArrayDeque :
//creates an empty ArrayDeque with default capacity of 16
ArrayDeque()//creates an ArrayDeque with all the elements present in the given collection
ArrayDeque(Collection c)/*
*constructs an empty ArrayDeque with a capacity sufficient
* to hold given number of elements
*/
ArrayDeque(int numElements)
我们对数据结构执行的最常见操作涉及插入,检索和删除。 在这里,对于每种操作,我们都有两组方法。
对于一组方法,如果操作失败,则会得到异常。 另一组方法将只返回一个指示操作状态的特殊值。
让我们探索这些方法:
运作方式 | 在头 | 尾巴 | ||
---|---|---|---|---|
引发异常 | 返回特殊值 | 引发异常 | 返回特殊值 | |
插入 | 无效addFirst(e) | boolean offerFirst(e) | 无效addLast(e) | boolean offerLast(e) |
恢复 | E getFirst() | E peekFirst() | E getLast() | E peekLast() |
删除/删除 | E removeFirst() | E pollFirst() | E removeLast() | E pollLast() |
1.插入:
addFirst()/ offerFirst()方法将一个元素添加到Deque的正面。 同样, addLast()/ offerLast()方法将元素添加到末尾。 这两种口味之间的区别是:
- 如果发生容量冲突, addFirst()/ addLast()方法将引发异常
- offerFirst()/ offerLast()方法仅因容量不足而返回false
但是, ArrayDeque是无限制的双端队列实现。 因此, offerFirst()/ addFirst()和offerLast()/ addLast()方法的行为方式相同。 他们只是根据用法将元素添加到正面或背面:
Deque<Integer> dq = new ArrayDeque<>();dq.addFirst(1);
dq.addLast(2);
dq.offerFirst(3);
dq.offerLast(4);System.out.println(dq); //[3, 1, 2, 4]
2.检索:
getFirst()/ getLast()或peekFirst()/ peekLast()方法将分别返回第一个和最后一个元素,而不会将其删除:
Deque<Integer> dq = new ArrayDeque();dq.addFirst(1);
dq.addFirst(2);System.out.println(dq.getFirst() + ":" + dq.peekFirst()); //2:2
System.out.println(dq.getLast() + ":" + dq.peekLast()); //1:1
注意,在空双端队列上调用getFirst()/ getLast()方法将引发异常。 但是,如果双端队列为空,则peekFirst()/ peekLast()方法将返回null :
Deque<Integer> dq = new ArrayDeque<>(); // empty dequeInteger val1 = dq.getFirst(); //throws NoSuchElementExceptionInteger val2 = dq.peekFirst(); // null
3.删除:
要从双端队列中删除一个元素,我们可以使用:
- removeFirst()/ removeLast():分别从双端队列中移除第一个/最后一个元素。 如果双端队列为空,则这些方法将引发异常,或者
- pollFirst()/ pollLast():分别从双端队列中移除first / last元素。 他们将为空双端队列返回null
Deque<Integer> dq = new ArrayDeque<>();dq.addLast(1);
dq.addLast(2);Integer val1 = dq.removeFirst(); //1
System.out.println(dq); //[2]Integer val2 = dq.pollFirst(); //2
System.out.println(dq); //[]val1 = dq.removeFirst(); // will throw a NoSuchElementException
val2 = dq.pollFirst(); // null
4.其他方法:
让我们看一下其他一些常用方法:
- void push(E e):将元素压入双端队列的堆栈表示的顶部
- E pop():在双端队列的堆栈表示顶部弹出一个元素
- boolean isEmpty():对于空的双端队列返回true
- int size():返回双端队列所包含的元素数
- boolean contains(Object obj):如果给定对象存在于双端队列中,则返回true
- void clear():删除所有双端队列元素
- E remove():返回并删除head元素
- boolean removeFirstOccurrence(E e):从头到尾遍历双端队列,并删除指定元素的第一次出现
- boolean removeLastOccurrence(E e):删除指定元素的最后一次出现
结论:
在本教程中,我们了解了流行的Deque实现类,即ArrayDeque 。
根据Javadocs,当用作堆栈时,此类可能比Stack快。 另外,用作队列时,它可能比LinkedList更快。 大多数ArrayDeque操作(在前端或后端进行操作)的摊销成本为O(1) 。
翻译自: https://www.javacodegeeks.com/2019/05/java-arraydeque.html