0
public class MyString {
    public static void main(java.lang.String[] args){
        String a="Hello";
        a=a.trim().concat("World");
        String c="HelloWorld";
        System.out.println(a==c);//returns false
    }

对于字符串文字,实习应该隐式发生。那么为什么 a 和 c 被视为两个不同的字符串?a 和 c 会指向字符串池中的相同内存引用吗?a 和 c 返回的哈希码相同,但 a==c 返回 false。有人可以解释为什么返回的值是假的。

4

2 回答 2

1

对于字符串文字,实习应该隐式发生

确实如此。

那为什么 a 和 c 被视为两个不同的字符串

因为它们是两个不同的String实例,恰好具有相同的内容。a的值不是字符串文字。

于 2018-06-26T07:22:48.387 回答
0

该方法concat不会将新创建的字符串添加到字符串的内部。这里是实现concat

public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}

以下内容也记录在JLS中:

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

这意味着当代码执行时,String c="HelloWorld";会创建一个新的 String 并将其添加到实习生中,因为前一个字符串HelloWorld不存在于实习生中。

这两个字符串因位置(参考)不同而不同,因此使用 == 检查它们会返回 false。

于 2018-06-26T07:24:19.583 回答