关于Java堆空间字符串对象存储的查询

关于Java堆空间字符串对象存储的查询,java,string,Java,String,我知道 String s1 = "test"; String s2 = new String("test"); System.out.println(s1==s2); // false 在上面的代码段中,“test”字符串对象是在java的字符串池中创建的(s1将被传递其引用) 并且将在内存的堆空间中创建一个新的字符串对象(s2将在heap sapce中) 因此,s2字符串对象是在内部引用字符串池的“测试”字符串对象,还是s2在内存中保留一个完全不同的“测试”字符串对象 如果我们以某种方式删

我知道

String s1 = "test";
String s2 = new String("test");
System.out.println(s1==s2);  // false
在上面的代码段中,“test”字符串对象是在java的字符串池中创建的(s1将被传递其引用) 并且将在内存的堆空间中创建一个新的字符串对象(s2将在heap sapce中)

因此,s2字符串对象是在内部引用字符串池的“测试”字符串对象,还是s2在内存中保留一个完全不同的“测试”字符串对象

如果我们以某种方式删除字符串常量池中的“测试”字符串对象,会有什么影响?s2是否仍具有值“test”?

我知道这个话题已经被触及了很多,但我之前检查的答案中没有一个能澄清它

如果有更好的解释,请提及任何来源

提前谢谢

在中,
String(String)
构造函数重用参数中的
value
字段


请注意,
value
是一个
char[]
,因此这两个字符串实例使用相同的底层数组,但是
s2
在内部没有使用
“test”
本身,因为这是一个
字符串,而不是
char[]

,这是指向Corey McGlone文章的链接


在中,
String(String)
构造函数重用参数中的
字段。只是想知道:你为什么会在意?应该避免将字符串与==;所以再一次。。。您想要解决的实际问题是什么?@AndyTurner我还有一个问题-String在内部存储char[]-数组。如果调用构造函数字符串(String),则会引用存储在新字符串实例中的char[]-数组。如果我理解正确,问题中描述的s1和s2是不同的实例,但是在堆内部char[]-数组是相同的。还是我错了?@Supahupe这正是我在下面的回答中所说的。谢谢,我不确定一开始你是否应该避免只使用链接的答案,因为如果链接消失,这些答案就没有用处了。考虑编辑你的答案,包括链接文章中的相关细节。