Java字符串和StringPool

Rob*_*ert 2 java string

public String makinStrings() {
   String m = "Fred47";
   String s = "Fred";
   s = s + "47";
   s = s.substring(0);
   return s.toString();
} 
Run Code Online (Sandbox Code Playgroud)

代码创建了多少个对象?

我做了一个简单的测试:

public static void main(String[] args) {
   String m = "a";
   m += "bc";
   String s1 = "mabc".substring(1);
   String s2 = "abc";

   System.out.println(m == "abc");
   System.out.println(m == s1);
   System.out.println(m == s2);
   System.out.println(s1 == s2);
}
Run Code Online (Sandbox Code Playgroud)

如果m,s1,s2指向同一个对象("abc"),结果不应该是"真,真,真,真"吗?相反,结果是"假,假,假,假"!

Jon*_*eet 5

结果在这种情况下是正确的-但是m,s1s2所有参考不同的字符串.对于常量字符串表达式自动执行Interning,并且可以通过调用该intern方法显式调用,但是字符串连接和子字符串不会自动发生.

在Sun的Java 7实现中,实际上x.substring(0) x再次返回相同的reference(),但我不相信这是由API保证的.

看看你的例子:

public String makinStrings() {
   String m = "Fred47";
   String s = "Fred";
   s = s + "47";
   s = s.substring(0);
   return s.toString();
}
Run Code Online (Sandbox Code Playgroud)

前两行要求内存中有两个字符串,但我不确切知道何时保证创建对象.一旦他们已经被创建,他们将坚持围绕-因此调用makinStrings一次不会造成这两条线了.

字符串连接创建一个新的字符串对象.

substring呼叫不会创造我已经看过了实施一个新的字符串对象-但它可能.

调用s.toString() 不会创建新字符串(这在JavaDoc中指定).