【问题标题】:How is String concatenation working in following字符串连接如何在以下工作
【发布时间】:2020-08-18 16:01:48
【问题描述】:

根据以下How Java String pool works when String concatenation? 对话,

String a = "hello world!";
String b = "hello" + " world!";
boolean compare = (a == b);

compare 应该是正确的,这是正确的。 但是,我有以下代码

String s1 = "This is";
String s2 = " a new String";
String s3 = s1 + s2;
String s4 = "This is a new String";

比较System.out.printf("s3 == s4:%s\n", s3 == s4);//always false 它总是错误的。我的理解是,在s1s2 的连接上,s3 将在池中创建一个字符串,当创建s4 时,它将指向同一个池位置。但这种情况并非如此。我已经用不同的JDK(包括7、8和14)进行了尝试,结果是一致的。

【问题讨论】:

  • “s3 将在池中创建一个字符串”没有。运行时评估的字符串只有在您明确请求时才会添加到池中,intern()

标签: java string concatenation


【解决方案1】:

这就是 Java 语言规范(强调我的)中指定池字符串的行为方式:

3.10.5 String Literals

[...]

此外,字符串文字总是引用类String 的同一实例。这是因为字符串文字 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部”的,以便共享唯一实例,使用方法String.intern

只有String 类型的constant expressions 被池化。 "This is a new String""hello" + " world!" 是常量表达式。编译器可以在编译时评估这些表达式。 s1 + s2 不是常量表达式。

所以在执行s1 + s2 时,会创建一个新字符串。但请注意,另一个字符串恰好与新字符串具有相同的字符,位于字符串池中,因为您使用字符串文字来初始化 s4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多