字符串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
引用也不同于str
。 str
指向字符串池中的某个位置,而str1
指向堆上的某个位置。
如果你添加
str1 = str1.intern();
在str1 = str1 + "abcd";
要显式实例化新创建的String,您的第二个if
语句将返回true
。
或者, str1 = (str1 + "abcd").intern();
会产生同样的效果。
如果字符串要比较值,我们应该使用equals方法,因为它比较字符串变量中存在的值。
但是当我们选择使用==比较字符串变量时,它会比较String对象的地址而不是值,因此即使它们具有相同的值,它也会返回false。
你是对的,字符串被添加到字符串池。 但是==检查两个对象是否指向字符串池中的相同引用(以使其更简单地指向相同的内存位置)。 而.equals()方法检查对象的值是否相同。