有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有相同引用的java字符串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");
    }
}

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

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


共 (3) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

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

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

    此新创建的字符串不会自动放入字符串池

    因此str1引用与str不同,即使字符串具有相同的内容str指向字符串池中的一个位置,而str1指向堆上的一个位置

    如果你加上

    str1 = str1.intern();
    

    str1 = str1 + "abcd";显式插入新创建的字符串之后,第二个if语句返回true

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

  3. # 3 楼答案

    将字符串添加到字符串池是正确的。但是==检查两个对象是否都指向字符串池中的同一引用(以便更简单地指向同一内存位置)。鉴于方法检查两个对象的值是否相同