Java ArrayDeque的介绍

评论 0 浏览 0 2017-11-27

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
在引擎盖下,ArrayDeque 由一个数组支持,该数组在填充时将其大小加倍。

最初,数组的初始化大小为16。它被实现为一个双端队列,它维护着两个指针,即头和尾。

让我们在较高的层次上看看这个逻辑的实际应用。

4.1. ArrayDeque 作为堆栈


可以看出,当用户使用push方法加入一个元素时,它将头部指针移动了一个。

当我们弹出一个元素时,它将头部位置的元素设置为null,这样该元素就可以被垃圾回收,然后将头部指针向后移动一个。

4.2.ArrayDeque作为一个Queue

Queue
当我们使用offer方法加入一个元素时,它将尾部指针移动了一个。

当用户轮询一个元素时,它将头部位置的元素设置为null,这样该元素就可以被垃圾回收,然后移动头部指针。

4.3.关于ArrayDeque的说明

最后,关于这个特定的实现,还有一些值得理解和记住的注意事项:

  • 这不是线程安全的。
  • 不接受空的元素
  • 比同步的Stack工作速度快得多。
  • 它是一个比LinkedList更快的队列,因为有更好的引用位置性。
  • 大多数操作都有摊销后的恒定时间复杂度
  • ArrayDeque返回的Iterator是快速失败的。
  • ArrayDeque在添加元素时,当头部和尾部的指针相遇时,会自动将数组的大小翻倍。

5.总结

在这篇短文中,我们说明了ArrayDeque中的方法的用法。

所有这些例子的实现都可以在GitHub项目中找到;这是一个基于Maven的项目,所以应该很容易导入并按原样运行。

最后更新2023-03-04
0 个评论
标签