【问题标题】:Strings - Stack and heap in java字符串 - Java 中的堆栈和堆
【发布时间】:2014-04-30 21:37:02
【问题描述】:

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

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

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

【问题讨论】:

  • 如果没有必要,为什么要保留相同字符串的 2 个版本?
  • 您的问题与堆栈上的内容和堆上的内容无关。您可以通过删除对两者的引用来使其更清晰。

标签: java string


【解决方案1】:

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

在这个例子中看不到,因为String 是不可变的,但如果这些是可变数据结构,例如ArrayList,那么通过one 修改对象将使相同的更改通过two 可见,因为它们指向同一个对象。

【讨论】:

    【解决方案2】:

    现在one 将指向two
    由于所有字符串都是不可变的,因此当它们被创建时,它们被存储在堆中并由变量引用,但是当您创建或分配新变量到相同的字符串时它不会显式创建新字符串,而只会引用 heap

    中的相同字符串

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

    【讨论】:

    • 而这些引用存储在堆栈中?
    • @user3562135 检查链接以获得您的答案。
    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 2012-09-28
    • 2019-08-11
    • 2012-10-06
    • 2014-03-12
    • 2012-10-16
    • 2012-02-06
    • 2011-04-22
    相关资源
    最近更新 更多