我知道Strings存储在堆上,对它们的引用存储在堆栈中。因此,在下面的代码中,one
将从堆栈指向堆上的"John"
,同样two
将从堆栈指向堆上的"Smith"
。
那么当我one = two
时会发生什么?
one
现在指向two
所指向的位置,因为two
包含对堆上某点的引用,或者它是否将堆上的"John"
更改为"Smith"
}?
String one;
one = "John";
String two = "Smith"
one = two;
答案 0 :(得分:5)
在您的示例中,one
现在指向与two
相同的位置。堆"John"
上的原始字符串变为垃圾,并且需要进行垃圾回收。
在此示例中无法看到,因为String
是不可变的,但如果这些是可变数据结构,例如ArrayList
,则通过one
修改对象通过two
可以看到相同的变化,因为它们指向同一个对象。
答案 1 :(得分:0)
现在one
将指向two
。由于所有字符串都是不可变的,因此当它们被创建时,它们将存储在堆中并由变量引用但是当您创建或赋值时变量到同一个字符串然后它不会显式创建新字符串,而只是引用heap
中的相同字符串