java中的堆与栈

   java中堆和栈(本文主要关注栈帧中的局部变量表)都是用来存放数据的地方,下面来讲讲这两种存储方式的特点。

  1、栈的特点是存取速度快,但所存数据大小与生存期必须是确定的(编译后就已经确定大小)。

  数据共享:

  栈中主要存储八大基本类型的数据:bolean、byte、short、int、long、float、double、char,以及对象的引用。

int a = 1;
int b = 1;
System.out.println(a == b);  //输出: true

int类型属于八大基本类型,数值将直接存储在栈中,a和b都为1,自然相等。

 

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

Object o1 = new Object();
Object o2 = new Object();
System.out.println(o1==o2);  //输出: false

object 非基本类型,所以创建的对象存储在堆中,栈中则存储对对象的引用,o1和o2是两个不同对象的引用,自然不相等。

 

  3、String类型在java中有点与众不同,它虽然不是基本类型,但有时候可以把它当基本类型对待。

   

 String a="123"; //step1
 String b="123"; //step2
 System.out.println(a==b);  //step3  output:true

 当直接给字符串变量赋值,变量值将会保存在字符串池中。在step1中,会先判断字符串池中是否已经存在“123”这个值,如果没有,则创建并存于字符串池中,再将a指向它;如果有,则将a直接指向它,无需再创建。执行step2时,因为“123”这个值已存在,b将直接指向它。所以step3中a == b的值为true。

     


 

  String a="123"+"456"; //step1
  String b="123"+"456"; //step2
  System.out.println(a==b);  //step3  output:true
        
  String c="123";
  String d="456";
  String e=c+d; //step4
  String f=c+d; //step5
  System.out.println(e==f); //step6  output:false

 

  在此例中,step1、step2中的“+”是连接符,所以step3中的输出为true,不难理解。

     但是step4和step5中则不同,这里的“+”将变量c和d整合在一起,e和f是两个新创建的对象,所以step6中的输出为false。如果用javap工具反编译可知道,step4和step5其实是通过StringBuilder进行处理的。

 

 

posted @ 2016-03-02 10:26  maozs  阅读(637)  评论(0编辑  收藏  举报