我知道
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仍然会有“测试”的价值吗?
我知道这个话题已被触及了很多,但我检查过的所有答案都没有澄清它。
如果有更好的解释,请提及任何来源。
提前致谢!
答案 0 :(得分:2)
在the Java 8 source code中,String(String)
构造函数会重用参数中的value
字段。
请注意,value
是char[]
,因此两个字符串实例使用相同的基础数组,但s2
内部未使用"test"
本身,因为这是String
,而不是char[]
。
答案 1 :(得分:1)
以下是Corey McGlone撰写文章的链接
http://www.javaranch.com/journal/200409/Journal200409.jsp#a1