【发布时间】:2020-02-01 20:18:41
【问题描述】:
如果我们有一个 String s = "Hello" 它将在字符串池中创建字符串 "Hello" 并且一些引用指向字符串 s 如果我更改 s="World" 会怎样。在字符串池中它将创建新的 String "世界”,现在我的参考指向世界。 “Hello”字符串会发生什么?
【问题讨论】:
如果我们有一个 String s = "Hello" 它将在字符串池中创建字符串 "Hello" 并且一些引用指向字符串 s 如果我更改 s="World" 会怎样。在字符串池中它将创建新的 String "世界”,现在我的参考指向世界。 “Hello”字符串会发生什么?
【问题讨论】:
...字符串对象是不可变的...
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 然后引用第二个常量。
【讨论】:
String 对象是不可变的,因此您的第二次分配所发生的只是对象引用更新。
字符串字面量对象(如“Hello”和“World”)将从 Java 的字符串池中引用(它们是实习的)。由于这算作参考,因此“Hello”对象在您重新分配后不会被垃圾收集。只有当代码本身变得不可访问时才会发生这种情况(例如,如果整个类是动态加载的,并且它的类加载器现在变得不可访问)。
【讨论】: