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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM