Java 如果更改字符串值,字符串池如何管理引用?
如果我们有一个字符串s=Hello,它将在字符串池中创建字符串Hello,并且一些引用指向字符串s。如果我更改s=World,会怎么样。在字符串池中,它将创建新的字符串世界,现在我的引用指向世界。Hello字符串会发生什么情况?来自: 。。。字符串对象是不可变的 编译时已知的字符串常量也被特别处理。它们存储在一个固定的池中。所有相等的编译时字符串常量都引用相同的字符串对象。这就是原因Java 如果更改字符串值,字符串池如何管理引用?,java,string,Java,String,如果我们有一个字符串s=Hello,它将在字符串池中创建字符串Hello,并且一些引用指向字符串s。如果我更改s=World,会怎么样。在字符串池中,它将创建新的字符串世界,现在我的引用指向世界。Hello字符串会发生什么情况?来自: 。。。字符串对象是不可变的 编译时已知的字符串常量也被特别处理。它们存储在一个固定的池中。所有相等的编译时字符串常量都引用相同的字符串对象。这就是原因 String s1 = "Hello"; String s2 = "Hello"; System.out.pri
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2);
将打印为真。还有其他一些有趣的例子。我写了一篇文章,展示了一些有趣的案例
当将一个值重新分配给一些非基本类型变量时,旧对象仍然存在于堆上,只要垃圾收集器认为它不符合收集条件。更改的是变量s引用的位置。在本例中,在编译时创建第二个字符串常量,然后s引用第二个常量。字符串对象是不可变的,因此第二次赋值只会更新对象引用 像Hello和World这样的字符串文本对象将从Java的字符串池中被引用,它们被插入其中。由于这是一个引用,因此在重新分配之后,Hello对象不会被垃圾收集。只有当代码本身变得不可访问时才会发生这种情况,例如,如果整个类是动态加载的,而它的类加载器现在变得不可访问