Java里面Stack有兩種含義:
一:數據結構
Stack,即java.util.Stack
import java.util.Stack; import java.util.Iterator; import java.util.List; public class StackTest { public static void main(String[] args) { Stack stack = new Stack(); // 將1,2,3,4,5添加到棧中 for(int i=1; i<6; i++) { stack.push(String.valueOf(i)); } // 遍歷並打印出該棧 iteratorThroughRandomAccess(stack) ; // 查找“2”在棧中的位置,並輸出 int pos = stack.search("2"); System.out.println("the postion of 2 is:"+pos); // pup棧頂元素之后,遍歷棧 stack.pop(); iteratorThroughRandomAccess(stack) ; // peek棧頂元素之后,遍歷棧 String val = (String)stack.peek(); System.out.println("peek:"+val); iteratorThroughRandomAccess(stack) ; // 通過Iterator去遍歷Stack iteratorThroughIterator(stack) ; } /** * 通過快速訪問遍歷Stack */ public static void iteratorThroughRandomAccess(List list) { String val = null; for (int i=0; i<list.size(); i++) { val = (String)list.get(i); System.out.print(val+" "); } System.out.println(); } /** * 通過迭代器遍歷Stack */ public static void iteratorThroughIterator(List list) { String val = null; for(Iterator iter = list.iterator(); iter.hasNext(); ) { val = (String)iter.next(); System.out.print(val+" "); } System.out.println(); } }
Stack的特點為LIFO,即后進先出(Last in, first out)。
一般與之比較的是隊列Queue,隊列是兩個口,先進先出。
二:內存區域
系統一般在內存中划分出兩種不同的內存空間,一種是Stack(棧),一種是heap(堆)
它們的主要區別是:
stack是有結構的,每個區塊按照一定次序存放,可以明確知道每個區塊的大小;heap是沒有結構的,數據可以任意存放。因此,stack的尋址速度要快於heap。
每個線程分配一個stack,每個進程分配一個heap,也就是說,stack是線程獨占的,heap是線程共用的。
stack創建的時候,大小是確定的,數據超過這個大小,就發生stack overflow錯誤,而heap的大小是不確定的,需要的話可以不斷增加。
如果棧內存沒有可用的空間存儲方法調用和局部變量,JVM會拋出java.lang.StackOverFlowError。
而如果是堆內存沒有可用的空間存儲生成的對象,JVM會拋出java.lang.OutOfMemoryError。
使用-Xss設置內存中棧的大小,使用-Xms設置最小堆內存,使用-Xmx設置最大堆內存。
數據存放的規則是:只要是局部的、占用空間確定的數據,一般都存放在stack里面,否則就放在heap里面。
http://www.jianshu.com/p/00edd5f5f1e2