Java ArrayDeque

介绍:

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 deque
 
Integer val1 = dq.getFirst(); //throws NoSuchElementException
 
Integer 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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值