堆栈与堆的区别

堆栈与堆都是存放在内存之中。

堆栈:必须确定存放数据的大小与生存期,因此速度很快,仅次于位于处理器内部的寄存器。但不灵活。常用来存放句柄和基本类型。

堆:动态分配内存大小与生存期,因此牺牲了速度,但很灵活,常用来存放对象。

基本类型中,例如int a = 3,b= 3。

首先会在栈中寻找字面值为3的地址,如果有,则让a指向该地址,如果没有,则开辟一个新的空间存储字面值3,同时将a指向该地址。而b由于已经在栈中存在字面值为3的空间,直接让b指向字面值为3的地址。因此a == b,因为它们两个指向同一个地址。

如果再另a = 4。

首先会在栈中寻找字面值为4的空间,如果存在则将a指向该地址,否则,开辟一个新的空间存储字面值4,再将a指向该地址。原来的b不受影响。此时a != b,因为它们地址不同。

String类型中,例如String str = "abc";

编译器首先会执行String str;

然后在栈中寻找字面量为"abc"的地址,如果没有,则开辟新的空间,存放字面值为"abc",同时new一个String,句柄为o,然后将"abc"的地址返回给o,再将o的地址返回给str。如果有,则寻找o的地址,然后将o的地址返回给str。

用代码来说则是:

String a = "abc";

String b = "abc";

System.out.print(a == b) //true

因为他们指向的是同一个o的地址。

然后另a = "bcd";

则此时System.out.pring(a == b); //false

因为a已经指向了另外一个地址。

如果此时再另b="bcd";

则System.out,print(a == b); //true

因为他们又重新指向了一个指向同一个字面量的句柄。

而如果一旦使用String a = new String();来创建对象,则地址一定不会相同,即使在栈中已经存在同一个字面量的值,仍会开辟一个新的空间出来存放地址。

原文地址:https://www.cnblogs.com/yxth/p/8377689.html