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

时间:2016-04-20 06:51:24

标签: java string concat

这是我的代码,我现在对String pool和 通过此输出堆存储。

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并将存储在字符串池中(如果我出错了,请纠正我!)。 现在,在使用字符串str1进行concat "abcd"之后,它们都具有相同的值。 所以,我认为str和str1在字符串池中应该具有相同的引用,因此,第二if语句应该打印true,但它会打印false

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

3 个答案:

答案 0 :(得分:5)

Java自动实习生(意思是,将它们放入字符串池)String literals ,而不是新创建的字符串。另请参阅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();具有相同的效果。

答案 1 :(得分:-1)

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

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

答案 2 :(得分:-2)

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