Deque接口实现栈功能
参考资料:Java中用Deque接口代替Stack接口完成栈功能
引言
最近在LeetCode或者牛客网上刷题时,发现很多关于栈的题目的题解都是使用Deque来实现栈的功能,之前我一直都是使用Stack接口来实现栈
Stack<T> stack = new Stack<>()但在Java Doc里建议用Deque替代Stack接口完成栈的功能
原因
Deque继承自Queue,而Stack继承自Vector
Vector是由数组实现的集合类,他包含了大量集合处理的方法。而Stack之所以继承Vector,是为了复用Vector中的方法,来实现进栈(push)、出栈(pop)等操作。这里就是Stack设计不好的地方,既然只是为了实现栈,不用链表来单独实现,而是为了复用简单的方法而迫使它继承Vector,Stack和Vector本来是毫无关系的。这使得Stack在基于数组实现上效率受影响,另外因为继承Vector类,Stack可以复用Vector大量方法,这使得Stack在设计上不严谨,例如Vector中的:
public void add(int index, E element) { insertElementAt(element, index); }可以在指定位置添加元素,这与Stack 的设计理念相冲突(栈只能在栈顶添加或删除元素)。所以Java后来修正了这个不良好的设计,提出了用Deque代替Stack的建议。
Deque
Java中的Deuqe,即“double ended queue”的缩写,是Java中的双端队列集合类型,可以由ArrayDeuqe或者LinkedList实现,两者使用的区别以及优劣类似于数组和链表
常用方法
- 适用于栈的peek(), push(), pop()方法
- 适用于队列的方法add(), offer(), remove(), poll(), peek()等方法
- 适用于双端队列的相关方法