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

时间:2016-06-03 07:38:18

标签: java string

我知道

String s1 = "test";
String s2 = new String("test");
System.out.println(s1==s2);  // false

在上面的片段“test”中String对象是在java中的String池内创建的(s1将传递给它的引用) 并且将在内存的堆空间中创建一个新的String对象(s2将在堆sapce中)。

所以将s2 String对象在内部引用String池的“test”String对象,或者s2在内存中保留一个完全不同的“test”String对象

如果我们以某种方式“测试”字符串常量池中的字符串对象被删除会有什么影响? s2仍然会有“测试”的价值吗?

我知道这个话题已被触及了很多,但我检查过的所有答案都没有澄清它。

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

提前致谢!

2 个答案:

答案 0 :(得分:2)

the Java 8 source code中,String(String)构造函数会重用参数中的value字段。

请注意,valuechar[],因此两个字符串实例使用相同的基础数组,但s2内部未使用"test"本身,因为这是String,而不是char[]

答案 1 :(得分:1)

以下是Corey McGlone撰写文章的链接

http://www.javaranch.com/journal/200409/Journal200409.jsp#a1