棧在java中我們稱為Stack類,它是Vector類的子類,而Vector又是List接口的子接口。
既然說到Vector類,我們延伸一個知識點,即Vector與ArrayList的區別: 1. Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,由于線程的同步必然要影響性能,因此,ArrayList的性能比Vector好 2.當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣,ArrayList就有利于節約內存空間。
棧的操作 棧除了繼承了Vector類的所有方法之外,它還有自己獨特的方法:boolean empty():判斷堆棧是否為空。Object peek(): 返回棧頂元素,但不刪除它。Object pop(): 返回棧頂元素,并在這個過程中刪除它。Object push(Object element):壓入element到堆棧,同時返回element。int search(Object element):查找element對象,返回element對象所在位置的 下標,如果不存在element對象則返回-1。 注意看個方法的作用,返回類型和是否帶參!下面我們通過一個自己創建的棧來演示其中的壓棧,彈棧和返回棧頂元素的操作。
public class TryPRe { private List lis; public TryPre() { lis=new ArrayList();//創建集合對象,然后就可以接收棧元素 } public Object push(Object ob)//壓棧,該方法帶參 { return lis.add(ob); } public Object peek()//返回棧頂元素 {// if(lis.size()==0)//當集合長度為0的時候就沒法返回棧頂元素,所有才會發生異常// {// throw new TryPreException();// } return lis.get(lis.size()-1); } public Object pup()//彈棧 {// if(lis.size()==0)//當集合長度為0的時候就沒法彈棧// {// throw new TryPreException();// } Object ob=lis.get(lis.size()-1);//先存到ob里面 lis.remove(lis.size()-1);//刪除棧頂元素 return ob; } }
public class TryPreTest {public static void main(String[] args) {TryPre tp=new TryPre();tp.push("01張無忌");tp.push("02獅王");tp.push("03鷹王");tp.push("04蝙蝠王");tp.push("05趙敏");System.out.println("棧頂元素是:"+tp.peek());//當我們再一次調用peek()方法時返回的結果依然是一樣的for (int i = 0; i < 5; i++) {System.out.println("彈棧順序是:"+tp.pup());}}} 那么我們考慮一個問題,如果當i<5改為i<=5時會發生什么異常(會發生集合下標越界異常而不是棧空異常,這是因為這個棧是我們自己定義的棧,里面的方法也是自定義的,如果用Stack sk=new Stack()來創建對象,然后用對象去調用里面的操作方法那么當出現剛才這種情況時就會出現棧空異常) 下面我們來自定義一個異常來處理這種問題
//取消TryPre當中的注釋代碼和把TryPreTest中的i<5改為i<=5
public class TryPreException extends RuntimeException{//因為出現下標越界時沒有提示強制拋出 public TryPreException() { // TODO Auto-generated constructor stub super("棧空已經空了,無法彈出元素");}}
|
新聞熱點
疑難解答