当前位置: 首页 > 知识库问答 >
问题:

为什么我要在堆栈上使用Deque?

陆飞鸿
2023-03-14

我需要一个stack数据结构用于我的用例。我应该能够将项目推入数据结构,并且我只想从堆栈中检索最后一个项目。JavaDoc for Stack表示:

Deque<Integer> stack = new ArrayDeque<>();

共有1个答案

宓昂雄
2023-03-14

首先,从继承的角度来说,它更明智。在我看来,stack扩展了vector这一事实真的很奇怪。在Java早期,继承被过度使用,例如properties

对我来说,你引用的文件中最重要的一个词是始终如一的。deque公开了一组操作,这些操作都是关于能够从集合的开始或结束提取/添加/移除项、迭代等--仅此而已。由于stackvector的一个子类,因此无法通过位置访问元素。

哦,而且stack没有接口,所以如果您知道需要stack操作,那么最终只能提交到特定的具体类,这通常不是一个好主意。

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(new ArrayList<>(stack)); // prints 1, 2, 3


Deque<Integer> deque = new ArrayDeque<>();
deque.push(1);
deque.push(2);
deque.push(3);
System.out.println(new ArrayList<>(deque)); // prints 3, 2, 1

deque.iterator()的JavaDocs中也对此进行了解释:

以正确的顺序返回此deque中元素的迭代器。元素将按照从第一个(头部)到最后一个(尾部)的顺序返回。

 类似资料:
  • 问题内容: 我的用例需要一个数据结构。我应该能够将项目推送到数据结构中,而我只想从堆栈中检索最后一个项目。该堆栈的JavaDoc说: Deque接口及其实现提供了一组更完整和一致的LIFO堆栈操作,应优先使用此类。例如: 我绝对不希望这里出现同步行为,因为我将使用方法本地的数据结构。除了这个,我为什么还要在这里呢? PS:Deque的Javadoc说: 双端队列也可以用作LIFO(后进先出)堆栈。

  • 问题内容: 我是Hadoop / ZooKeeper的新手。我不明白将ZooKeeper与Hadoop结合使用的目的,ZooKeeper是否在Hadoop中写入数据?如果不是,那么为什么我们将ZooKeeper与Hadoop一起使用? 问题答案: Hadoop 1.x不使用Zookeeper。即使在Hadoop 1.x安装中,HBase也会使用zookeeper。 Hadoop从2.0版开始也采用

  • 问题内容: 我的第一段代码是我的项目对象文件;第二个是主班。在运行代码没有任何问题之前,但是在添加读写文件之后,我的代码开始收到堆栈流错误。只是正在调用错误的代码段。 我的主班: 如何找到导致堆栈溢出的地方? 问题答案: 创建: 并创造 因此,在初始化时,您将不断创建这些对象 有一个类似的Baeldung示例,用于获取StackOverflowError 由于ClassOne的构造函数实例化了Cl

  • 日志输出为 日志输出为 为什么会这样?为什么不打印异常详细信息?我必须做什么才能获得堆栈跟踪信息? 日志框架:org.slf4j 1.7.26 logback 1.2.3

  • 问题内容: 我在网上研究过immutablejs的好处,但是没有发现任何令人满意的东西! 我的问题是,当我可以冻结一个普通的旧javascript对象时,为什么我应该使用该库并使用非本机数据结构? 问题答案: 我认为您不了解immutablejs提供的功能。这不是一个使您的对象变得不可变的库,而是一个使用不可变值的库。 在不简单重复他们的文档和任务说明的情况下,我将说明它提供的两件事: 类型。他们

  • 我有一个堆栈的ArrayList,我在其中一个堆栈中添加了一个元素,并在列表中循环打印每个堆栈的索引 然后我从上一个堆栈中删除元素,将其添加到下一个堆栈中,打印每个堆栈的索引,并对ArrayList中的所有堆栈继续此操作 然而,当任何堆栈为空时,在获取ArrayList中每个堆栈的索引时会出现非常不寻常的行为。非空的堆栈将具有正确的索引值,而空的堆栈将具有错误的索引值 此外,如果包含元素的堆栈的索