看完SCJP Tip Line的作者Corey McGlone撰写关于javaranch网站的文章后,我感到很困惑.命名为Strings,Literally和SCJP Java 6程序员指南,由Kathy Sierra(javaranch的联合创始人)和Bert Bates撰写.
我将尝试引用Corey先生和Kathy Sierra女士引用的关于String Literal Pool的内容.
1.据Corey McGlone先生说:
String Literal Pool是指向String对象的引用的集合.
String s = "Hello"; (假设Heap上没有名为"Hello"的对象),将"Hello"在堆上创建一个String对象,并在String Literal Pool(Constant Table)中放置对该对象的引用
String a = new String("Bye");(假设Heap上没有名为"Bye" new的对象,操作符将强制JVM在堆上创建一个对象.
现在,"new"对于创建String及其引用的运算符的解释 在本文中有点令人困惑,所以我将文章本身的代码和解释放在下面.
public class ImmutableStrings
{
public static void main(String[] args)
{
String one = "someString";
String two = new String("someString");
System.out.println(one.equals(two));
System.out.println(one == two);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,由于关键字,我们实际上最终会遇到略微不同的行为."new."
在这种情况下,对两个String文字的引用仍然放在常量表(String Literal Pool)中,但是当你来到关键字时"new,"JVM必须在运行时创建一个新的String对象,而不是使用常量表中的那个.
这是解释它的图表..

那么它是否意味着,String Literal Pool也有对这个Object的引用?
以下是Corey McGlone撰写文章的链接
http://www.javaranch.com/journal/200409/Journal200409.jsp#a1
2. …
Java中的以下两个初始化之间有什么区别?
String a = new String();String b = new String("");我有这两种情况:
String s = "aa";
s = s + " aa";
System.out.println(s);
//......
Run Code Online (Sandbox Code Playgroud)
工作正常!它打印aa aa.但有个问题:
String s = "aa";
this.addStringToStatement(s, " aa");
System.out.println(s);
//...
private void addStringToStatement(String statement, Object value) {
statement += value;
}
Run Code Online (Sandbox Code Playgroud)
它打印:aa.是什么原因??谢谢!