字符串Concat具有相同的参考?

Dar*_*hit 4 java string concat

这是我的代码,我现在对此输出的字符串池和堆存储非常困惑.

public class String1 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        String str = "abcd";
        String str1 = "" ;

        str1=str1+"abcd";

        if(str.equals(str1))
            System.out.println("True");
        else
            System.out.println("False");

        if(str == str1)
            System.out.println("True");
        else
            System.out.println("False");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我正在创建String str并将存储在字符串池中(如果我出错了,请纠正我!).现在,在str1使用字符串连接后,"abcd"它们都具有相同的值.所以,我认为strstr1应该在String池中有相同的引用,所以,第二个if语句应该打印true但是打印false.

那么,我的问题为什么str和str1没有得到相同的参考?

And*_*ter 5

Java自动实习(意味着,将它们放入String池)字符串文字,而不是新创建的字符串.另请参见/sf/answers/129862841/.

请记住,字符串是不可变的,因此+运算符必须创建一个新的String - 它不能附加到现有字符串.在内部,+运算符使用a StringBuilder来连接字符串.最后的结果将通过检索StringBuilder.toString()其基本上确实return new String(value, 0, count);.

这个新创建的String不会自动放入String池中.

因此str1,str即使字符串具有相同的内容,该引用也是不同的.str指向字符串池中的某个位置,同时str1指向堆上的某个位置.

如果你添加

str1 = str1.intern();
Run Code Online (Sandbox Code Playgroud)

str1 = str1 + "abcd";显式实习新创建的String之后,第二个if语句返回true.

或者,str1 = (str1 + "abcd").intern();会产生同样的效果.