栈(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:对象就储存在堆内存中


引用人家的一段话:

  堆和栈的区别可以用如下的比喻来看出:    
  使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就  
  走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自  
  由度小。    
  使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由  
  度大。