一洋幻、簡(jiǎn)述
在說(shuō)Stack之前,咱們先來(lái)聊聊棧和隊(duì)列翅娶,什么叫棧文留?什么叫隊(duì)列?通俗來(lái)講竭沫,棧就是先進(jìn)后出燥翅,隊(duì)列是先進(jìn)先出。
- Stack就是基于棧的思想實(shí)現(xiàn)的一個(gè)后進(jìn)先出(last in first out蜕提,LIFO)的堆棧森书。
- 繼承于Vector,并在在Vector類的基礎(chǔ)上擴(kuò)展5個(gè)方法而來(lái)谎势。
二凛膏、分析
由于Stack源碼較小,主要功能都在Voctor類以及實(shí)現(xiàn)它浅,所以咱們直接看源碼译柏。
public class Stack<E> extends Vector<E> {
/**
* * 序列化唯一表示UID
*/
private static final long serialVersionUID = 1224463164541339165L;
/**
* 無(wú)參構(gòu)造函數(shù)
* 創(chuàng)建一個(gè)空的棧
*/
public Stack() {
}
/**
* 將一個(gè)元素添加到棧頂,線程安全
*
* @param item 元素
* @return
*/
public E push(E item) {
addElement(item);
return item;
}
/**
* 移除棧頂?shù)脑亟慊簦⑶曳祷卦撛乇陕螅€程安全
*
* @return 返回將要移除棧頂?shù)脑? */
public synchronized E pop() {
E obj;
int len = size();
obj = peek();
removeElementAt(len - 1);
return obj;
}
/**
* 查看棧頂?shù)脑兀遣话哑湟瞥龡m斈髡郏€程安全
*
* @return 返回查看的棧頂元素
*/
public synchronized E peek() {
// 獲取棧內(nèi)元素長(zhǎng)度
int len = size();
// 等于0代表是一個(gè)空棧
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
/**
* 判斷當(dāng)前棧是否為空
*
* @return true代表為空胯府,false代表不為空
*/
public boolean empty() {
return size() == 0;
}
/**
* 獲取當(dāng)前元素在棧中的索引坐標(biāo),線程安全
*
* @param o 將查找的元素
* @return 返回-1則代表該棧中不包含當(dāng)前元素恨胚,否則返回其對(duì)應(yīng)的索引位置
*/
public synchronized int search(Object o) {
// 獲取元素o的索引位置
int i = lastIndexOf(o);
// 大于等于0代表有這個(gè)元素骂因,并且返回其在棧內(nèi)的索引位置
// 注意i是底層數(shù)組的索引位置,size-i是棧的索引位置
if (i >= 0) {
return size() - i;
}
return -1;
}
}