zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Storm入门(二)集群环境安装
    JAVA字符集
    JAVA中int、String的类型转换
    JAVA中int、String的类型转换
    使用字节流读写中文字符
    10个实用的但偏执的Java编程技术
    10个实用的但偏执的Java编程技术
    解析java实体类
    解析java实体类
    SSh三大框架的作用
  • 原文地址:https://www.cnblogs.com/hongdada/p/6464158.html
Copyright © 2011-2022 走看看