【问题标题】:How String pool manages references if we change string value?如果我们更改字符串值,字符串池如何管理引用?
【发布时间】:2020-02-01 20:18:41
【问题描述】:

如果我们有一个 String s = "Hello" 它将在字符串池中创建字符串 "Hello" 并且一些引用指向字符串 s 如果我更改 s="World" 会怎样。在字符串池中它将创建新的 String "世界”,现在我的参考指向世界。 “Hello”字符串会发生什么?

【问题讨论】:

    标签: java string


    【解决方案1】:

    来自documentation of String

    ...字符串对象是不可变的...

    String-constants 在编译时已知也被特殊处理。它们存储在一个常量池中。所有“相等”的编译时间String-constant 引用相同的String-object。这就是原因

    String s1 = "Hello";
    String s2 = "Hello";
    System.out.println(s1 == s2);
    

    将打印true。还有一些其他有趣的例子。我写了一个Ideone example a while back,展示了其中一些有趣的案例。

    当一个非原始类型变量s 重新赋值时,旧对象仍然存在于堆中(只要垃圾收集器认为它不适合收集)。改变的是变量s 引用的位置。在本例中,第二个String-constant 在编译时创建,s 然后引用第二个常量。

    【讨论】:

      【解决方案2】:

      String 对象是不可变的,因此您的第二次分配所发生的只是对象引用更新。

      字符串字面量对象(如“Hello”和“World”)将从 Java 的字符串池中引用(它们是实习的)。由于这算作参考,因此“Hello”对象在您重新分配后不会被垃圾收集。只有当代码本身变得不可访问时才会发生这种情况(例如,如果整个类是动态加载的,并且它的类加载器现在变得不可访问)。

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 2021-07-11
        • 1970-01-01
        • 2016-01-09
        • 2012-08-13
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多