当我了解堆栈和队列时,它使用堆栈/队列而不是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( 时间。所以不适合作为队列使用,因为一个队列应该在不同的端排队和轮询,与其他更合适的队列数据结构相比,一端的操作效率低下。