Java堆(heap)、栈(stack)和队列的区别
?Java里面Stack有兩種含義:
一:數(shù)據(jù)結(jié)構(gòu)
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的特點(diǎn)為LIFO,即后進(jìn)先出(Last in, first out)。
一般與之比較的是隊(duì)列Queue,隊(duì)列是兩個口,先進(jìn)先出。
二:內(nèi)存區(qū)域
系統(tǒng)一般在內(nèi)存中劃分出兩種不同的內(nèi)存空間,一種是Stack(棧),一種是heap(堆)
它們的主要區(qū)別是:
stack是有結(jié)構(gòu)的,每個區(qū)塊按照一定次序存放,可以明確知道每個區(qū)塊的大小;heap是沒有結(jié)構(gòu)的,數(shù)據(jù)可以任意存放。因此,stack的尋址速度要快于heap。
每個線程分配一個stack,每個進(jìn)程分配一個heap,也就是說,stack是線程獨(dú)占的,heap是線程共用的。
stack創(chuàng)建的時候,大小是確定的,數(shù)據(jù)超過這個大小,就發(fā)生stack overflow錯誤,而heap的大小是不確定的,需要的話可以不斷增加。
如果棧內(nèi)存沒有可用的空間存儲方法調(diào)用和局部變量,JVM會拋出java.lang.StackOverFlowError。
而如果是堆內(nèi)存沒有可用的空間存儲生成的對象,JVM會拋出java.lang.OutOfMemoryError。
使用-Xss設(shè)置內(nèi)存中棧的大小,使用-Xms設(shè)置最小堆內(nèi)存,使用-Xmx設(shè)置最大堆內(nèi)存。
數(shù)據(jù)存放的規(guī)則是:只要是局部的、占用空間確定的數(shù)據(jù),一般都存放在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
總結(jié)
以上是生活随笔為你收集整理的Java堆(heap)、栈(stack)和队列的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最多包含2/k个不同字符的最长串
- 下一篇: Step By Step_Java通过J