直接添加的字符串与引用之间的区别

时间:2017-06-04 08:57:00

标签: java string string-pool

我遇到了一个询问以下输出的问题:

    String s1 = "String 1";
    String s2 = "String 2";

    String s3 = s1 + s2;
    String s4 = "String 1" + "String 2";

    System.out.println(s3==s4);

输出 - false

现在,由于字符串不是使用new运算符创建的,因此对象是在字符串池中创建的,因此根据我的理解s1 + s2"String 1" + "String 2"应该相等,{{1}应该是s3==s4

但事实并非如此。任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:4)

The concatenation在运行时发生,除非两个操作数都是编译时常量表达式。

在s1和s2之前放置final修饰符,结果为true,因为编译器只会替换

String s3 = s1 + s2;

通过

String s3 = "String 1String 2";

如果不这样做,则在运行时创建一个新的String,方法是将两个字符串附加到StringBuilder并获取结果。

请注意,尽管从知识的角度来看这很有意思,但在实践中,您不应该关心性能优化,并始终将字符串与equals()进行比较。

答案 1 :(得分:1)

此行比较两个字符串的内存地址。因为两者都是单独的对象,输出将是假的。

s3==s4

您需要使用equals()

进行比较
System.out.println(s3.equals(s4));

equals()是对象非地址的比较值。