栈(Stack):数据结构上是一种顶端开口结构,只能在栈顶(top)进行操作的数据。是系统自动分配。
堆(Heap):一种树形结构,可以随时存放和取走。需要程序员自己分配,Java中最常用的就是new这个关键字。
常量区(常量池)(Constant pool):常量字符串就是存放在这个地方。只可以读不可以写。
全局区也叫静态区(Static Area):存放全局变量和静态变量,可读可写。
程序代码区:存放函数体的二进制代码。
public class Stack {
String str="Helloworld";
//str 就位于堆区,"HelloWorld"位于常量池
String str1=new String("Helloworld");
//str1位于栈区,"Helloworld"就位于堆区
public void method(String string)
{
// TODO Auto-generated method stub
String s2=new String("HelloWorld");
//s2是栈,新建的"HellpWorld"这个String对象就位于堆区
String s3="HelloWorld";
//s3是栈,"HellpWorld"这个String对象就位于堆区
//这个局部变量位于方法里面
}
}
栈和堆的理论知识
1申请方式
stack:是系统自动分配内存 heap:程序员自己申请,并指明大小。
2申请后的系统响应
stack:只要系统剩余的栈大于申请的栈,就会没事,否则就会出现栈溢出。
heap:系统会帮你找到比较合适的区域,系统中会有一个链表记录剩余地址空间。
3申请效率
stack:比较快,程序员无法控制
heap:一般运行速率比较慢
4 面向的对象
stack:基本类型、对象的引用
heap:对象就储存在堆内存中
引用人家的一段话:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就
走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自
由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由
度大。