1

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

    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 + s2and"String 1" + "String 2"应该是相等的,s3==s4应该是true.

但这并没有真正发生。任何人都可以解释一下吗?

4

2 回答 2

4

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

final在 s1 和 s2 前加上修饰符,结果为真,因为编译器会简单地 替换

String s3 = s1 + s2;

经过

String s3 = "String 1String 2";

如果不这样做,则会在运行时通过将两个字符串附加到 StringBuilder 并获取结果来创建一个新字符串。

请注意,尽管从知识的角度来看这很有趣,但在实践中,您不应该关心性能优化,而是始终将 Strings 与equals().

于 2017-06-04T09:04:10.687 回答
1

这一行比较两个字符串的内存地址。因为两者都是单独的对象,所以输出将是错误的。

s3==s4

你需要比较使用equals()

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

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

于 2017-06-04T09:12:17.370 回答