字符串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"); } } 

现在,我正在创建String str并将存储在字符串池中(如果我出错了,请纠正我!)。 现在在concat str1使用字符串"abcd"它们都具有相同的值。 所以,我认为str和str1应该在String池中具有相同的引用,因此, if语句应该打印为true ,则它会打印为false

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

Java自动实习 (意味着,将它们放入String池)字符串文字 ,而不是新创建的字符串。 另请参见https://stackoverflow.com/a/1855183/1611055 。

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

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

因此,即使字符串具有相同的内容, str1引用也不同于strstr指向字符串池中的某个位置,而str1指向堆上的某个位置。

如果你添加

 str1 = str1.intern(); 

str1 = str1 + "abcd"; 要显式实例化新创建的String,您的第二个if语句将返回true

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

如果字符串要比较值,我们应该使用equals方法,因为它比较字符串变量中存在的值。

但是当我们选择使用==比较字符串变量时,它会比较String对象的地址而不是值,因此即使它们具有相同的值,它也会返回false。

你是对的,字符串被添加到字符串池。 但是==检查两个对象是否指向字符串池中的相同引用(以使其更简单地指向相同的内存位置)。 而.equals()方法检查对象的值是否相同。