多面的LinkedList:可作队列,栈,双端队列
为什么LinkedList能当做栈,队列,双端队列?
笔记:
- 为什么LinkedList能当做栈,队列,双端队列?LinkedList是一个继承于AbstractSequentialList的双向链表。其中的每个对象包含数据的同时还包含指向链表中前一个与后一个元素的引用。LinkedList同时实现了List接口和Deque对口,也就是收它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack)
- 接一:LinkedList 实现 List 接口,能进行队列操作。
LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
LinkedList如何作为栈、队列、双端队列使用
笔记:
- 具体API看上面的链接
- LinkedList能当做栈时的API?
- LinkedList能当做队列时的API?
- LinkedList能当做双端队列时的API?
List接口长什么样?
笔记:
- List接口长什么样?这得先看Collection 接口。因为Collection接口是 List / Set / Queue 接口的父接口,List / Set / Queue 的实现类中很多的操作方法其实还是调用Collection类定义的方法。
- 看看Collection在LinkedList继承体系中的位置
-
Collection 接口其中方法可以分为以下几类:
数据操作类方法:add/addAll/remove/removeAll/clear/retainAll/iterator
判断类方法:contains/containsAll/equals/hashcode/isEmpty/size
所有继承 Collection 接口的集合都可以用 Collection 中的方法进行元素操作,而具体的集合类有根据其特性增加了一些其特有的方法。
- List接口在Collection接口的基础上拓展了一些方法,增加了一些自己独有的方法。具体看上面的链接。
Deque接口什么样?
- Deque接口:
queue是队列,只能一头进,另一头出。
如果把条件放松一下,允许两头都进,两头都出,这种队列叫双端队列(Double Ended Queue),学名Deque。
Java集合提供了接口Deque来实现一个双端队列,它的功能是:
- 既可以添加到队尾,也可以添加到队首;
- 既可以从队首获取,又可以从队尾获取。
- Queue和Deque出队入队的区别?
对于添加元素到队尾的操作,
Queue
提供了add()
/offer()
方法,而Deque
提供了addLast()
/offerLast()
方法。添加元素到对首、取队尾元素的操作在
Queue
中不存在,在Deque
中由addFirst()
/removeLast()
等方法提供。注意到
Deque
接口实际上扩展自Queue
-
在Java中,我们用
Deque
可以实现Stack
的功能:- 把元素压栈:
push(E)
/addFirst(E)
; - 把栈顶的元素“弹出”:
pop()
/removeFirst()
; - 取栈顶元素但不弹出:
peek()
/peekFirst()
。
- 把元素压栈:
为什么使用Deque而不使用Stack构造栈
笔记:
- Stack和Collection的关系如下图:
- 为什么使用Deque而不使用Stack构造栈?可以看出Stack是继承自Vector,而Vector有效率问题已经被弃用了,因此继承Vector的Stack也存在效率问题,故不推荐使用。
为什么java不推荐使用Vector?
- Vector有什么效率问题?为什么会有效率问题?
- 以后补充