字符串 - 堆栈和堆在java中

时间:2014-04-30 21:37:02

标签: java string

我知道Strings存储在堆上,对它们的引用存储在堆栈中。因此,在下面的代码中,one将从堆栈指向堆上的"John",同样two将从堆栈指向堆上的"Smith"

那么当我one = two时会发生什么? one现在指向two所指向的位置,因为two包含对堆上某点的引用,或者它是否将堆上的"John"更改为"Smith" }?

String one;
one = "John";
String two = "Smith"
one = two;

2 个答案:

答案 0 :(得分:5)

在您的示例中,one现在指向与two相同的位置。堆"John"上的原始字符串变为垃圾,并且需要进行垃圾回收。

在此示例中无法看到,因为String是不可变的,但如果这些是可变数据结构,例如ArrayList,则通过one修改对象通过two可以看到相同的变化,因为它们指向同一个对象。

答案 1 :(得分:0)

现在one 将指向two。由于所有字符串都是不可变的,因此当它们被创建时,它们将存储在堆中并由变量引用但是当您创建或赋值时变量到同一个字符串然后它不会显式创建新字符串,而只是引用heap中的相同字符串 enter image description here

从上面的图片中你可以很容易地理解不变性的概念 供参考Where does java reference variable stored?

相关问题