JAVA中字符串的内部运作机制是如何实现的?

5

我从博客中了解到,在使用+运算符时,Java 内部使用 StringBuilder 来连接字符串。我刚刚进行了测试,并发现一些奇怪的输出。

public class StringDemo {

    public static void main(String[] args) {

        String a = "Hello World";
        String b = "Hello World";
        String c = "Hello";
        String d =  c + " World".intern();
        String e =  new StringBuilder().append(String.valueOf(c)).append(" World").toString().intern() ;
        String f =  new StringBuilder(String.valueOf(c)).append(" World").toString().intern();

        System.out.println(a == b);   // Line 1 Expected output true
        System.out.println(a == d);   // Line 2 Output is false
        System.out.println(a == e);   // Line 3 Output is true
        System.out.println(a == f);   // Line 4 Output is true

    }
}

所以我使用+运算符连接两个字符串c"World",然后使用intern()方法将字符串d移至池中。
据我所知,Java使用StringBuilder,因此现在我使用StringBuilder来连接字符串,并对字符串ef使用intern()方法。如果两者相等,则两个字符串的地址必须相同,但第2行的输出与第4行和第5行不匹配。
感谢您宝贵的反馈。
1个回答

10

Java中的内部实现原理

这里有一篇与此相关的帖子,可以阅读编译器版本:Java中字符串连接的实现原理。

至于您代码中的部分

System.out.println(a == d); 

应该只是false

根据您的理解,您期望得到true。不,您的理解是错误的。这里有一个明显的区别:

    String d =  c + " World".intern();

而且

    String d =  (c + " World").intern();

第一行只有 "World" 被interned,而第二行 "Hello World" 也被interned。

当你执行 (c + " World").intern()时,输出结果为 true


2
糟糕,小错误。谢谢Suresh。 - Kick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接