java中的堆与栈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的堆与栈相关的知识,希望对你有一定的参考价值。

  对于初学者来说,java成员方法中的参数传递的究竟是什么可能有些疑惑,如果理解java在创建变量堆和栈的使用,一切就能清楚明白了。

  java中堆和栈都是用来存放数据的地方。

  1、栈的特点是存取速度快,数据可共享,但所存数据大小与生存期必须是确定的,缺乏灵活性。

  数据共享:

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

  如果我们同时定义 

 

  int a=1;  //step1

  int b=1;  //step2

  int b=2;  //step3

  

  很明显,int类型变量将存储在栈中。系统会先执行step1,首先创建一个a的引用,再查找栈中是否已经存在int类型的值1,如果存在,将a指向它;如果不存在,则将1放进来,再将a指向它。

  然后再执行step2,过程雷同step1,不过因为栈中已经存在1,所以b直接指向已存在的1。

  最后执行step3,它会先判断栈中是否已存2,若存在,则将b指向2;若不存在,则现在栈中存入2,再指向它。而a的值不受影响,仍然是1;

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

 

String a=new String("abc");   //step1
String b=new String("abc"); //step2
System.out.println(a==b); //step3

  java中创建的对象都保存在堆中,通常以new的方式创建。与栈不同的是,它不会判断创建的对象的值是否已存在,直接重新分配空间存储。所以上面代码中step3的结果为false。

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

   

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

  如过用step1和step2的方法创建String类型变量,变量值将会保存在字符串池中。在step1中,字符串池与栈一样,它会先创建名为a的String类型引用,再判断字符串池中是否有“123”这个值,如果没有,则创建,再将a指向它;如果有,则将a直接指向它,无需再创建。执行step2时,因为“123”这个值已存在,b将直接指向它。由此我们可以得出step3中输出的值为true。

     


 

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

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

     但是step4和step5中则不同,这里的“+”将变量c和d整合在一起,创建了两个新的对象e和f,所以step6中的输出为false。

  

以上是关于java中的堆与栈的主要内容,如果未能解决你的问题,请参考以下文章

Object的堆与栈 变量

Java堆与栈

堆与栈

js的堆与栈

STM32的堆与栈与编译信息查看

c++堆与栈的简单认识