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

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。有人可以解释为什么返回的值是错误的。


收到一只叮咚
浏览 191回答 2
2回答

呼唤远方

字符串文字应隐式进行实习是的那么为什么a和c被当作两个不同的字符串因为它们是两个不同的String实例,所以碰巧具有相同的内容。a的值不是字符串文字。

守着一只汪

该方法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中,因为前一个HelloWorldintern不存在。这两个字符串的位置(引用)不同,因此使用==对其进行检查将返回false。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java