Stack继承自Vector,因此具有Vector的全部功能和特点,同时,Stack实现了类似栈的先进后出的特点,它提供了从顶端访问数据和添加数据的方法。
执行push操作时,将元素推入栈中,即添加到数组的末尾,
执行peek操作时,取出栈顶元素,即数组末尾元素,但是不会移除该元素,
执行pop操作时,取出栈顶元素,即数组末尾元素,但是将移除该操作。
Stack源码分析:
package java.util;
/**
* Stack是一个LIFO(Last-In/First-Out)先进后出,后进先出的数据结构。
* 用户可以通过pop和push方法操作Stack中的元素,它没有大小的限制(当然,
* 它使用int值来保存其元素数量,所有无法超过int值范围),
* 可以添加null对象(不推荐,因为很多情况下会返回null对象)
*/
public class Stack extends Vector {
private static final long serialVersionUID = 1224463164541339165L;
/**
* 使用默认大小创建Stack(10),继承于Vector
*/
public Stack() {
}
/**
* 返回当前Stack是否为空
*/
public boolean empty() {
return isEmpty();
}
/**
* 返回当前Stack中的最后一位元素,及顶端元素
* 此操作不会移除元素
*/
@SuppressWarnings("unchecked")
public synchronized E peek() {
try {
return (E) elementData[elementCount - 1];
} catch (IndexOutOfBoundsException e) {
throw new EmptyStackException();
}
}
/**
* 返回当前Stack的最后一位元素,顶端元素
* 此操作会移除该元素
*/
@SuppressWarnings("unchecked")
public synchronized E pop() {
if (elementCount == 0) {
throw new EmptyStackException();
}
final int index = --elementCount;
final E obj = (E) elementData[index];
elementData[index] = null;
modCount++;
return obj;
}
/**
* 将元素添加到Stack的顶端,即尾部
*/
public E push(E object) {
addElement(object);
return object;
}
/**
* 返回指定元素的角标值,将会从Stack的顶端向底部查找,
* 及从尾部向首位查找。
*/
public synchronized int search(Object o) {
final Object[] dumpArray = elementData;
final int size = elementCount;
if (o != null) {
for (int i = size - 1; i >= 0; i--) {
if (o.equals(dumpArray[i])) {
return size - i;
}
}
} else {
for (int i = size - 1; i >= 0; i--) {
if (dumpArray[i] == null) {
return size - i;
}
}
}
return -1;
}
}