Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果更改字符串值,字符串池如何管理引用?_Java_String - Fatal编程技术网

Java 如果更改字符串值,字符串池如何管理引用?

Java 如果更改字符串值,字符串池如何管理引用?,java,string,Java,String,如果我们有一个字符串s=Hello,它将在字符串池中创建字符串Hello,并且一些引用指向字符串s。如果我更改s=World,会怎么样。在字符串池中,它将创建新的字符串世界,现在我的引用指向世界。Hello字符串会发生什么情况?来自: 。。。字符串对象是不可变的 编译时已知的字符串常量也被特别处理。它们存储在一个固定的池中。所有相等的编译时字符串常量都引用相同的字符串对象。这就是原因 String s1 = "Hello"; String s2 = "Hello"; System.out.pri

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

来自:

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

编译时已知的字符串常量也被特别处理。它们存储在一个固定的池中。所有相等的编译时字符串常量都引用相同的字符串对象。这就是原因

String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2);
将打印为真。还有其他一些有趣的例子。我写了一篇文章,展示了一些有趣的案例


当将一个值重新分配给一些非基本类型变量时,旧对象仍然存在于堆上,只要垃圾收集器认为它不符合收集条件。更改的是变量s引用的位置。在本例中,在编译时创建第二个字符串常量,然后s引用第二个常量。

字符串对象是不可变的,因此第二次赋值只会更新对象引用

像Hello和World这样的字符串文本对象将从Java的字符串池中被引用,它们被插入其中。由于这是一个引用,因此在重新分配之后,Hello对象不会被垃圾收集。只有当代码本身变得不可访问时才会发生这种情况,例如,如果整个类是动态加载的,而它的类加载器现在变得不可访问