Java堆(heap)、栈(stack)和队列的区别
?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
http://www.ruanyifeng.com/blog/2013/11/stack.html
http://droidyue.com/blog/2014/12/07/differences-between-stack-and-heap-in-java/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
總結
以上是生活随笔為你收集整理的Java堆(heap)、栈(stack)和队列的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最多包含2/k个不同字符的最长串
- 下一篇: gerrit的git配置流程