Java编译器在编译时如何处理修改后的字符串

时间:2018-06-26 07:20:22

标签: java string string-comparison string-concatenation string-pool

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
    }

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

2 个答案:

答案 0 :(得分:1)

  

对于字符串文字,应该隐式进行

可以。

  

然后为什么将a和c视为两个不同的字符串

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

答案 1 :(得分: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并将其添加到该intern,因为先前的HelloWorld在intern中不存在。

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