Java中字符串常量池中两个字符串的连接

3

由于两个字符串的连接会在字符串常量池中创建一个新的字符串对象,所以为什么以下代码的结果为“否”。

public class Main {
    public static void main(String[] args) {
        String s = "abcd";
        String s1 = "ab";
        String s2 = "cd";
        s1 = s1+s2;
        if(s1==s)
            System.out.println("YES");
        else
            System.out.println("No");
            }
}

您可以在此处获取一些额外的信息:https://dev59.com/JWYq5IYBdhLWcg3w2EFi - C.Champagne
请明确equals和==之间的区别。 - user5914598
2个回答

6

s1+s2 不是编译时常量表达式,因为尽管它们被赋予编译时常量值,但 s1s2 不是 final。

因此,该值在运行时计算:结果与常量池中的值不是同一个实例,尽管值相同。


作为 new String() != "" - C.Champagne

1

这里s已经编译时分配了值,而s1是在运行时分配的,它们不是同一个实例字符串池。使用equals方法来检查字符串是否相等,例如:s1.equals(s)

如果两个值都是在运行时计算的,那么这将起作用。

String s1 = "ab";
String s2 = "cd";
String s3;
s1 = s1+s2;
s3 = s1;
if(s1==s3)
    System.out.println("YES");
else
    System.out.println("No");
}

它会输出YES。

如果两个值在编译时都被赋值,那么它将起作用。

String s = "abcd";
String s1 = "abcd";
if(s1==s)
    System.out.println("YES");
else
    System.out.println("No");
}

这段代码也会输出YES


3
为什么字符串常量池中的 s1 和 s 不指向同一个字符串? - JasHan ChaHal
1
如果 s =“abcd”,s1 =“abcd”,那么两个引用将是相同的。 - JasHan ChaHal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接