【问题标题】:String concatenation: + operator with String literal字符串连接:+ 运算符与字符串文字
【发布时间】:2016-07-19 21:56:00
【问题描述】:

为什么s3==s4 返回falses2==s3 返回true 行号。分别为 8 和 7。

 1. String s="hello";`
 2. String s1="he"+"llo";
 3. String s2="hello"+123;
 4. String s3="hello123";
 5. String s4=ss+"123";

 7. System.out.println(s==s1);//prints true
 8. System.out.println(s2==s3);//prints true
 9. System.out.println(s3==s4);//prints  false

【问题讨论】:

标签: java


【解决方案1】:

当你使用==运算符检查Strings的相等性时,它会检查Strings在内存中的位置是否相同。

在情况 2 和 4 中,字符串 "hello" 和 "hello123" 将已经在 字符串常量池 中(由于第 1 和 3 行)并且将被识别为等同于这些字符串, 并且将在内存中为每个使用相同的位置。简单来说,它将创建一个 String 对象并将其插入“hello”和“hello123”的两个实例中。

当你这样做时:

String s4=s+"123";

在运行时,它为s4 创建一个新的内存位置,因为JLS 表示:

在运行时通过连接计算的字符串是新创建的,因此是不同的。

因此,内存位置不同,因此它给出false 作为输出。

【讨论】:

    【解决方案2】:

    s + "123";不是编译时可评估的,因此不是字符串保留的候选者。 (请注意,如果 sfinal,那么它就是。)

    因此它的引用不会和s3一样,所以输出是false

    其他的都比较true,因为字符串保留和表达式的编译时可评估性。

    【讨论】:

    • 我知道回答这个问题有点淘气,因为在某个地方必须有足够的副本,但是@downvoters,请告诉我是否有问题回答;-)
    猜你喜欢
    • 2010-09-08
    • 2017-02-04
    • 1970-01-01
    • 2014-02-27
    • 2015-08-28
    • 1970-01-01
    • 2014-09-11
    • 2011-12-06
    • 2011-06-01
    相关资源
    最近更新 更多