java中的栈和堆(区别)

来源:互联网 发布:wps选定数据求和为0 编辑:程序博客网 时间:2024/05/21 23:51

Java 中的堆和栈 

Java把内存划分成两种:一种是栈内存,一种是堆内存。 

  在函数中定义的一些基本类型的变量和对象的引用变量(变量名)都在函数的栈内存中分配。 

  当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 

  堆内存用来存放new创建的对象(包括由基本类型包装起来的类:IntegerStringDouble,实际上每个基本类型都有他的包装类)和数组 

  在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 

  在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 

  引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

public class testthree{

  public static voidmain(String[] args) {

     String str1=new String("abc");

     String str2=new String("abc");

     System.out.println(str1==str2);

  }

}//返回的是false

 

public class testthree{

  public static voidmain(String[] args) {

     String str1=new String("abc");

     String str2="abc";

     System.out.println(str1==str2);

  }

}//返回的是false

 

public class testthree{

  public static voidmain(String[] args) {

     String str1="abc";

     String str2=new String("abc");

     System.out.println(str1==str2);

  }

}//返回的是false

栈和堆的比较:

1.       (stack)与堆(heap)都是Java用来在Ram中存放数据的地方。

2.       栈的优势是,存取速度比堆要快,缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

3.       堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

 

 

 

 

静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求

 栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。 

 

关于String str = "abc"的内部工作。Java内部将此语句转化为以下几个步骤:

(1)先定义一个名为str的对String类的对象引用变量:Stringstr;

(2)在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o 的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址,则查找对象o,并返回o的地址。

(3)将str指向对象o的地址。 值得注意的是,一般String类中字符串值都是直接存值的。但像String str ="abc";这种场合下,其字符串值却是保存了一个指向存在栈中数据的引用!

 


0 0