为什么我应该在堆栈上使用Deque和在队列上使用LinkedList?



当我了解堆栈和队列时,它使用堆栈/队列而不是ArrayList。 但是,我通过Intellij搜索API,堆栈和队列在列表集合中使用ArrayDeque类,而不是ArrayList。

/**
* <p>A more complete and consistent set of LIFO stack operations is
* provided by the {@link Deque} interface and its implementations, which
* should be used in preference to this class.  For example:
* <pre>   {@code   *   Deque<Integer> stack = new ArrayDeque<Integer>();}
*/

在队列中,它在 LinkedList API 中使用 LinkedList 类。 以及大多数人的代码,例如:

Queue<Integer> q1 = new LinkedList<>()
/**
* Queue operations.
* Retrieves, but does not remove, the head (first element) of this list.
*
* @return the head of this list, or {@code null} if this list is empty
* @since 1.5
*/

关键是,当它解释堆栈和队列的概念时,请使用ArrayList。

但是,实际上,使用LinkedList或ArrayDeque,而不是ArrayList。 你能解释一下为什么吗?

这个问题的大部分是特定于Java的,但是关于使用数组列表作为队列的部分更通用。


特别是在 Java 中,您应该使用ArrayDeque或其他 deque 实现而不是Stack类:根据文档,

Deque 接口及其实现提供了一组更完整、更一致的 LIFO 堆栈操作,应优先使用此类。

对于大多数用例,首选ArrayDeque的另一个原因是Stack扩展了Vector,这是一个同步实现。同步有性能损失,当堆栈仅从单个线程访问时(即几乎所有时间(都是不必要的。

ArrayDeque比作为堆栈的ArrayList更好,因为要在ArrayList上模拟pop方法,您必须编写s.remove(s.size() - 1),这既不方便又不太清楚。


你应该使用LinkedList而不是Queue的原因是Queue是一个接口,而不是一个类,所以你根本无法编写new Queue<>()来创建队列;这将给出编译错误。

请注意,最好还是将变量的类型声明为Queue<...>


不应该将ArrayList用作队列的原因更一般:它是一种动态数组数据结构,因此它只支持一端 O(1( 时间内的添加和删除操作。在另一端添加或删除需要 O(n( 时间。所以不适合作为队列使用,因为一个队列应该在不同的端排队和轮询,与其他更合适的队列数据结构相比,一端的操作效率低下。

相关内容

  • 没有找到相关文章

最新更新