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)和队列的区别的更多相关文章

  1. (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)

    [color=red][/color]<一> 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈 ...

  2. Java里的堆(heap)栈(stack)和方法区(method)

    基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量 . 方法 ...

  3. java栈stack和堆heap的工作原理,用途及区别?举例说明

    java堆和栈的区别[新手可忽略不影响继续学习] Java中内存分成两种:一种是栈stack,一种是堆heap.函数中的一些基本类型的变量(int, float)和对象的引用变量(reference) ...

  4. Java堆、栈和常量池以及相关String的详细讲解(经典中的经典) (转)

    原文链接 : http://www.cnblogs.com/xiohao/p/4296088.html 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的 ...

  5. Java堆、栈和常量池以及相关String的详细讲解

    一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  6. Java堆和栈的区别和介绍,JVM的堆和栈

    一.Java的堆内存和栈内存 Java把内存划分成两种:一种是堆内存,一种是栈内存.   堆:主要用于存储实例化的对象,数组.由JVM动态分配内存空间.一个JVM只有一个堆内存,线程是可以共享数据的. ...

  7. Java堆、栈和常量池以及相关String详解

    一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  8. 关于Java堆、栈和常量池的详解

    在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register).      这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译 ...

  9. Java堆、栈和常量池以及相关String的详细讲解(转)

    一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

随机推荐

  1. LeetCode——Binary Search Tree Iterator

    Description: Implement an iterator over a binary search tree (BST). Your iterator will be initialize ...

  2. 微信小程序 --- page.json文件

    page.json 文件用于配置当前目录.page.json文件里的配置可以修改 app.json 配置里面的 window:不能覆盖app.json文件里面的 tabBar / 网络超时/ debu ...

  3. Floyd求字典序最小的路径

    hdu1384 Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  4. C++ list容器系列功能函数详解

    C++ list函数详解 首先说下eclipse工具下怎样debug:方法:你先要设置好断点,然后以Debug方式启动你的应用程序,不要用run的方式,当程序运行到你的断点位置时就会停住,也会提示你进 ...

  5. [Android] 配置安卓模拟器,使得dex文件不被优化成odex

    最近做一个模块,需要将apk里面加载的dex文件dump出来,所以需要配置让dalvik不要把dex文件优化成odex. 1. 配置build.prop 主要是通过修改文件/system/build. ...

  6. 使用CXF做webservice整合现有项目的例子

    从网上看了很多CXF的资料,大部分都是单独的作为一个webservice项目,对于在现有的spring项目上提供webservice服务的例子基本没有找到. 我做的这个例子是介绍怎么把cxf整合到现有 ...

  7. | unauthenticated user (1130, "Host '127.0.0.1' is not allowed to connect to this MySQL server")

    mysql> show processlist;+----+----------------------+-----------------+------+---------+------+-- ...

  8. backend community-driven web framework

    kataras/iris: The fastest backend community-driven web framework on (THIS) Earth. HTTP/2, MVC and mo ...

  9. describe neural networks as a series of computational steps via a directed graph.

    https://www.microsoft.com/en-us/research/product/cognitive-toolkit/ https://github.com/microsoft/cnt ...

  10. 15.Git面试题

    1.git常见命令作用 git init 在哪一目录下,就会在该目录下生成.git目录. 注意:git init命令会把当前目录当作库. git status 查看本地库的状态 git add . 将 ...