Stack的声明如下,可以看到Stack继承了Vector,因此Stack可以使用Vector中的方法,如size() 等。
public
class Stack extends Vector
Stack类定义了5个方法,作用如下
方法 | 描述 |
---|---|
push | 将对象压入栈 |
pop | 将栈顶元素弹出 |
peek | 返回栈顶对象,但并不从栈中移除 |
empty | 判断栈是否为空 |
search(E o) | 返回对象在堆栈中的位置,若不存在则返回-1 |
Stack是继承自Vector的,而Vector是线程安全的,所以Stack也是线程安全的。
然而正因为Stack继承自Vector,**Stack类已经不被官方推荐使用!!**基于 Vector 实现的栈 Stack。底层实际上还是数组,所以还是存在需要扩容。这使得 Stack 在基于数组实现上效率受影响,另外因为继承 Vector 类,Stack 可以复用 Vector 大量方法,这使得 Stack 在设计上不严谨。
官方推荐使用LinkedList来构建栈。
与Stack不同,Java里的Queue不是一个类,而是一个接口。
Java集合类主要由两个根接口Collection和Map派生出来的,Collection派生出了三个子接口:List、Set、Queue,因此Java集合大致也可分成List、Set、Queue、Map四种接口体系.
接口中共定义了6个主要的方法
方法 | 描述 |
---|---|
add | 在队列尾部插入一个元素(队列满时抛异常) |
offer | 在队列尾部插入一个元素(队列满时返回false) |
remove | 返回队列头部的对象,并从栈中移除它(队列为空时,抛异常) |
poll | 返回队列头部的对象,并从栈中移除它(队列为空时,返回null) |
element | 返回队列头部的对象,但不从栈中移除它(队列为空时,抛异常) |
peek | 返回队列头部的对象,但不从栈中移除它(队列为空时,返回null) |
速记:add、element、remove(are是:是不是抛异常?是)抛异常;offer、poll、peek(opp)返回特定的值。
queue是后入先出,但是java中还有一个叫deque的队列,叫双端队列,可以实现两端的入队和出队,在有些场景,用起来是相当方便的。
其方法总结如下:
抛出异常 | 特殊值 | 抛出异常 | 特殊值 | |
插入 | addFirst(e) | offerFirst(e) | addLast(e) | offerLast(e) |
删除 | removeFirst() | pollFirst() | removeLast() | pollLast() |
检查 | getFirst() | peekFirst() | getLast() | peekLast() |
实现类 | 描述 |
---|---|
PriorityQueue | 非阻塞、非线程安全、无边界,支持优先级队列实现类 |
ConcurrentLinkedQueue | 非阻塞、线程安全、无边界,基于链接节点的队列实现类 |
ArrayBlockingQueue | 阻塞、线程安全、有边界,创建的时候指定大小,一旦创建容量不可改变实现类,默认是不保证线程的公平性,不允许向队列中插入null元素 |
LinkedBlockingQueue | 阻塞、线程安全、可选有边界,一个由链表结构组成的可选有界阻塞队列实现类,如果未指定容量,那么容量将等于Integer.MAX_VALUE |
PriorityBlockingQueue | 阻塞、线程安全、无边界,支持优先级排序的无边界阻塞队列实现类 |
DelayQueue | 阻塞、线程安全、无边界,使用优先级队列实现的无界阻塞队列实现类,只有在延迟期满时才能从中提取元素 |
SynchronousQueue | 阻塞、线程安全、无数据队列,不存储元素、没有内部容量的阻塞队列实现类 |
LinkedBlockingDeque | 阻塞、线程安全、无边界,由链表结构组成的可选范围双向阻塞队列实现类,如果未指定容量,那么容量将等于 Integer.MAX_VALUE |
Deque | 双端队列,允许两端都可以进行入队和出队操作的队列,其元素的逻辑结构仍是线性结构。将队列的两端分别称为前端和后端,两端都可以入队和出队。 |
从类继承图中可以看到,LinkedList即实现了Queue,又实现了Deque,